为什么在下面的示例中,当我设置t
时,元组names = []
没有更改,但是当我向names
列表添加新值时,会反映出更改?
看起来tuple
最初引用了列表,因此任何更改都反映在元组对象中,但清空它看起来像是一个新副本。
>>> names = ['Mark','Hary']
>>> t = (names,'Lauri')
>>> t
(['Mark', 'Hary'], 'Lauri')
>>> names.append('Donna')
>>> names
['Mark', 'Hary', 'Donna']
>>> t
(['Mark', 'Hary', 'Donna'], 'Lauri')
>>> names = []
>>> names
[]
>>> t
(['Mark', 'Hary', 'Donna'], 'Lauri')
答案 0 :(得分:6)
names.append('Donna')
会影响元组,因为元组会像names
那样持有对列表对象的相同引用,并且您在适当的位置进行变异( list.append
)。
names = []
是一个赋值语句,它不会改变引用,它会将名称names
重新绑定到一个新对象(这种情况下的空列表)。这样的重新绑定不会影响元组内已存在的引用。
您可以删除就地(即通过names
修改列表对象引用)并反映该更改。这可以通过多种方式完成,您可以使用names.clear()
或del names[:]
甚至names[:] = []
:
del names[:]
执行此操作后,t
内的引用会反映此更改:
print(t)
([], 'Lauri')