列入元组 - 修改列表反映在元组中但清空列表在元组中不会改变

时间:2016-12-15 19:33:33

标签: python list python-3.x tuples

为什么在下面的示例中,当我设置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')

1 个答案:

答案 0 :(得分:6)

names.append('Donna')会影响元组,因为元组会像names那样持有对列表对象的相同引用,并且您在适当的位置进行变异( list.append)。

names = []是一个赋值语句,它不会改变引用,它会将名称names重新绑定到一个新对象(这种情况下的空列表)。这样的重新绑定不会影响元组内已存在的引用。

您可以删除就地(即通过names修改列表对象引用)并反映该更改。这可以通过多种方式完成,您可以使用names.clear()del names[:]甚至names[:] = []

del names[:]

执行此操作后,t内的引用会反映此更改:

print(t)
([], 'Lauri')