Skip to main content
 首页 » 编程设计

python之List into a tuple之修改列表反射(reflect)在元组中但清空列表不会改变元组

2025年05月04日14mq0036

为什么在下面的例子中元组 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')