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

VBJ*_*VBJ 1 python tuples list python-3.x

为什么在下面的示例中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')
Run Code Online (Sandbox Code Playgroud)

Jim*_*ard 6

names.append('Donna')会影响到元组,因为元组是抱着相同的参考列表对象names呢,和你在的地方变异它(list.append).

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

你可以删除就地(即修改列表对象引用names),并有变化反映出来.这可以通过多种方式来完成,你可以使用names.clear()或者del names[:]甚至是names[:] = []:

del names[:]
Run Code Online (Sandbox Code Playgroud)

在此操作之后,内部引用t反映了此更改:

print(t)
([], 'Lauri')
Run Code Online (Sandbox Code Playgroud)

  • @VBJ `del names[:]` 删除列表的 *contents*,`del names` 从引用列表中删除名称 `names`。 (3认同)