2016-12-15 88 views
1

为什么在下面的示例中,当我设置names = []时,元组t不会更改,但是当我向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

来看,它通过[pythontutor] (http://pythontutor.com/visualize.html#code=names%20%3D%20%5B'Mark','Hary'%5D%0At%20%3D%20(names,'Lauri'%29% 0Aprint(T%29%0Anames.append( '唐娜' %29%0Aprint(名称%29%0Aprint(T%29%0Anames%20%3D%20%5B%5D%0Aprint(名称%29%0Aprint(T% 29累积=假heapPrimitives =假模式=编辑&原点=停用frontend.js&PY = 3&rawInputLstJSON =%5B%5D& textReferences = false))对于可视化这种事情非常有用。 –

+0

dang it,为什么我永远不能得到pythontutor链接来正确显示...... :( –

回答

6

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

names = []分配声明不变异的参考,它重新绑定名称names到一个新的对象(空列表在这种情况下)。这种重新绑定不会影响元组中已经存在的引用。

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

del names[:] 

,里面t参考具有这种变化体现在:

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

没问题,但是当我做'del names'时,它不会从'tuple'中删除列表。'del名称和删除名称[:]'? – VBJ

+3

@VBJ'del names [:]'删除列表的*内容*,'del names'从列表中删除名称'names' –

+0

谢谢。现在很清楚。 – VBJ