我正在查看一个类的实现collections.UserList
,并发现了一些不寻常的语法:
def __init__(self, initlist=None):
self.data = []
if initlist is not None:
# XXX should this accept an arbitrary sequence?
if type(initlist) == type(self.data):
self.data[:] = initlist
elif isinstance(initlist, UserList):
self.data[:] = initlist.data[:]
else:
self.data = list(initlist)
这行是什么意思?
self.data[:] = initlist.data[:]
我猜这是创建列表的浅表副本,但为什么要这样呢?为什么不简单写self.data = initlist.data[:]
呢?这样的语法是否会产生一些我不知道的效果?
是的,你是对的,这一行创建了列表的浅表副本。然而,使用
self.data[:]
相反语法self.data = initlist.data[:]
有其优点。当我们分配时self.data = initlist.data[:]
,我们创建一个新的列表对象并将其分配给一个变量self.data
。这意味着如果我们有其他对原始列表的引用initlist
,它们将不会在self.data
.另一方面,当我们使用语法 时
self.data[:]
,我们访问现有的列表对象self.data
并使用来自 的值更新它initlist.data
。这意味着所有链接都self.data
将指向更新的列表。这样做是为了保留原始类型
self.data
-list
设计self.data[:] = initlist.data[:]
保留容器的类型,仅更改其中的内容(元素):从结果可以看出,只剩下变量
lst3
了list