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

111 3

具體來說,我嘗試


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']



我應該在哪裡看到類似指針的行為?

时间: 原作者:

107 0

指針式行為實際上一直在發生,只是不可變類型是安全的;

在重複添加相同的對象時,你將看到此問題,


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))



原作者:
148 1

你已經注意到,每個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)

原作者:
...