gpt4 book ai didi

python - 关于UserList __init__ 的问题,( [ :], isinstance )

转载 作者:太空宇宙 更新时间:2023-11-04 00:08:52 25 4
gpt4 key购买 nike

我想用一些自定义方法扩展 python37 中的类列表。并最终阅读了 UserList cpython code .阅读后,关于 [:] 用法的新问题出现了。

如果我理解正确,`[:]` 制作了整个的切片副本`self.data`。但我想看看使用 `[:]` 有什么意义在 `=` 运算符的左侧。

选项一和选项二有什么区别吗?在 python 中试过口译员,两者似乎具有相同的效果,我错过了吗什么?

letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
# option (1)
letters[:] = []
# option (2)
letters = []

现在是关于 UserList 代码的问题。我添加了带有问题的评论。

class UserList(_collections_abc.MutableSequence):
def __init__(self, initlist=None):
self.data = []
if initlist is not None:
if type(initlist) == type(self.data):
# NOTE: Is this if statement doing the same?
# if isinstance(initlist, list):
self.data[:] = initlist
# NOTE: wouldn't in this case self.data keep a reference to initlist
# instead of a copy?
# self.data[:] = initlist[:] # could one replace that line with this one?
elif isinstance(initlist, UserList):
self.data[:] = initlist.data[:]
# NOTE: would this line accomplish the same?
# self.data = initlist.data[:]
else:
self.data = list(initlist)
...

最佳答案

如果您有另一个字母的引用,它们的行为就不一样了。

场景 1:就地修改 letters

>>> letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> lst = letters
>>> letters[:] = []
>>> letters
>>> []
>>> lst
>>> []

场景 2,将名称 letters 重新分配给一个空列表。

>>> letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> lst = letters
>>> letters = []
>>> letters
>>> []
>>> lst
>>> ['a', 'b', 'c', 'd', 'e', 'f', 'g']

names are reassigned independently , lst 没有看到任何变化。

如果你有

self.data = initlist

initlist 的变化会影响 self.data(因为它们在内存中是同一个对象)。

关于python - 关于UserList __init__ 的问题,( [ :], isinstance ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53187069/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com