list - python引用同一词典的列表

具体来说,我尝试


list_val=[]


local_dict={}


for val in ['a', 'b', 'c']:


 local_dict['first']=val


 list_val.append(local_dict)


 print(list_val)



产生


[{'first': 'a'}]


[{'first': 'b'}, {'first': 'b'}]


[{'first': 'c'}, {'first': 'c'}, {'first': 'c'}]



根据页面pythontutor.com的教程,我能够观察执行的步骤,并且我看到每个列表元素都指向正在更改的同一字典。

解决方法是在循环中声明字典,


list_val=[]


for val in ['a', 'b', 'c']:


 local_dict={}


 local_dict['first']=val


 list_val.append(local_dict)


 print(list_val)



产生


[{'first': 'a'}]


[{'first': 'a'}, {'first': 'b'}]


[{'first': 'a'}, {'first': 'b'}, {'first': 'c'}]



行为异常的原因是,因为我习惯将值追加到列表,如下所示:


list_val=[]


for val in ['a', 'b', 'c']:


 list_val.append(val)


 print(list_val)



产生


['a']


['a', 'b']


['a', 'b', 'c']



我应该在哪里看到类似指针的行为?

时间: 作者:

指针式行为实际上一直在发生,只是不可变类型是安全的;

在重复添加相同的对象时,你将看到此问题,


list_val=[]


local_dict={}


for val in ['a', 'b', 'c']:


 local_dict['first']=val


 list_val.append(local_dict)


 print(list_val)



从不将local_dict重新绑定到新对象,因此它始终是相同的dict,并且将相同的dict追加到,


list_val=[]


for val in ['a', 'b', 'c']:


 local_dict={}


 local_dict['first']=val


 list_val.append(local_dict)


 print(list_val)



local_dict重新绑定到完全新的dict,它与它以前绑定到的无关。

正如我所提到的,不可变类型将“安全”地运行,因此你不能只看一部分代码并知道它是否安全,例如:


list_val = []


for val in ['a', 'b', 'c']:


 x += val


 list_val.append(x)


 print(list_val)



替换:


 list_val.append(x)



使用:


 list_val.append(copy.deepcopy(x))



作者:

你已经注意到,每个list_val.append调用都指向同一个字典,因此当你更新字典时,列表中的每一项都会得到更新,这是python中的预期行为,这是因为python中的变量都是指向地址(而不是引用)的指针,此行为也以其他方式体现:


A =[1,2,3]


B=A


B.append(4)


print(A)


# prints [1,2,3,4] as opposed to [1,2,3]



id(B)==id(A)

作者:
...