为什么在下面的例子中元组 t当我设置 names = [] 时不会改变,但是当我向 names 添加新值时list 的变化体现出来了吗?
它看起来像 tuple最初引用列表,因此任何更改都反射(reflect)在元组对象中,但清空它看起来像是创建了一个新副本。
>>> 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')
请您参考如下方法:
names.append('Donna') 将影响元组,因为元组持有与 names 相同的列表对象引用确实如此,并且您正在就地对其进行变异 (list.append)。
names = [] 是一个不会改变引用的赋值语句,它重新绑定(bind)名称 names 到一个新对象(在本例中是一个空列表)。这样的重新绑定(bind)不会影响元组中已经存在的引用。
您可以删除就地(即修改引用的列表对象名称)并反射(reflect)该更改。这可以通过多种方式完成,您可以使用 names.clear() 或 del names[:] 甚至 names[:] = []:
del names[:]
此操作后,t 中的引用反射(reflect)了此更改:
print(t)
([], 'Lauri')
