淺談python中字典append 到list 后值的改變問題
看一個例子
d={'test':1} d_test=d d_test['test']=2 print d
如果你在命令行實(shí)踐的話,會發(fā)現(xiàn)你改動的是d_test ,但是d 也跟著改變了。
通常這和我們期待的不一樣。
Why?
因?yàn)樽值鋎 是一個object ,而d_test=d并沒有真正的將該字典在內(nèi)存中再次創(chuàng)建。只是指向了相同的object。這也是python 提高性能,優(yōu)化內(nèi)存的考慮。
實(shí)際場景
d={"name":""} l=[] for i in xrange(5): d["name"]=i l.append(d) print l
loop 后可能跟你想要的結(jié)果并不相同。
即使append到list 中,但是,list中存放的也是一個對象,或者說是字典的地址。而非內(nèi)存中真正的存儲空間。
使用 .copy()方法。可以創(chuàng)建一個新的獨(dú)立的字典
d={"name":""} l=[] for i in xrange(5): test=d.copy() test["name"]=i l.append(test) print l
更新:
a={'q':1,'w':[]} b=a.copy() b['q']=2 b['w'].append(123) print a print b
這個時候發(fā)現(xiàn)a中'q'的值不會變化但是其列表中的值還是發(fā)生了改變
因?yàn)閏opy是淺層次copy
但是這里有個track
a={'q':1,'w':[]} b=a.copy() b['q']=2 b['w']=[123] print a print b
直接賦值的話,則不會改變a中的結(jié)構(gòu)(多半是append這個方法的關(guān)系)
深層次的copy
import copy a={'q':1,'w':[]} b=copy.deepcopy(a)
以上這篇淺談python中字典append 到list 后值的改變問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用Python實(shí)現(xiàn)視頻轉(zhuǎn)音頻與音頻轉(zhuǎn)文本
這篇文章主要為大家詳細(xì)介紹了使用Python實(shí)現(xiàn)視頻轉(zhuǎn)音頻與音頻轉(zhuǎn)文本的相關(guān)知識,文中的示例代碼簡潔易懂,有需要的小伙伴可以參考一下2024-02-02Python進(jìn)程池Pool應(yīng)用實(shí)例分析
這篇文章主要介紹了Python進(jìn)程池Pool應(yīng)用,結(jié)合實(shí)例形式分析了Python進(jìn)程池Pool功能、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-11-11Python實(shí)現(xiàn)葵花8號衛(wèi)星數(shù)據(jù)自動下載實(shí)例
這篇文章主要為大家介紹了Python實(shí)現(xiàn)葵花8號衛(wèi)星數(shù)據(jù)自動下載實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10Python數(shù)據(jù)類型轉(zhuǎn)換詳解
本篇文章里小編給大家整理的是關(guān)于Python中常用數(shù)據(jù)類型之間的轉(zhuǎn)換相關(guān)知識點(diǎn),有需要的朋友們可以學(xué)習(xí)下,希望能夠給你帶來幫助2021-10-10Python獲取系統(tǒng)所有進(jìn)程PID及進(jìn)程名稱的方法示例
這篇文章主要介紹了Python獲取系統(tǒng)所有進(jìn)程PID及進(jìn)程名稱的方法,涉及Python使用psutil對系統(tǒng)進(jìn)程進(jìn)行操作的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-05-05