Python字典深淺拷貝與循環(huán)方式方法詳解
本節(jié)內(nèi)容
- 深淺拷貝
- 循環(huán)方式
- 字典常用方法總結(jié)
一、深淺拷貝
列表、元組、字典(以及其他)
對于列表、元組和字典而言,進(jìn)行賦值(=)、淺拷貝(copy)、深拷貝(deepcopy)而言,其內(nèi)存地址是變化不通的。
賦值(=)
賦值只是創(chuàng)建一個變量,該變量指向原來的內(nèi)存地址
>>> name1 = ['a','b',['m','n'],'c'] >>> name2 = name1 #輸出結(jié)果,兩個內(nèi)存地址是一樣的 >>> print(id(name1),',',id(name2)) 50077256 , 50077256
如圖所示:
淺拷貝(copy)
淺拷貝是指在內(nèi)存地址中,只拷貝出第一層的內(nèi)存的地址,所以拷貝變量和被拷貝變量的內(nèi)存地址是不一樣的(列表、元組和字典中的copy()方法都是淺拷貝)
>>> import copy >>> name1 = ['a','b',['m','n'],'c'] #淺copy >>> name2 = copy.copy(name1) >>> print(name1,',',id(name1)) ['a', 'b', ['m', 'n'], 'c'] , 50228296 >>> print(name2,',',id(name2)) ['a', 'b', ['m', 'n'], 'c'] , 50920008 #修改列表中的元素 >>> name1[0] = 'h' >>> name1[2][0] = 'M' >>> print(name1,',',id(name1)) ['h', 'b', ['M', 'n'], 'c'] , 50228296 >>> print(name2,',',id(name2)) ['a', 'b', ['M', 'n'], 'c'] , 50920008
如圖所示:
注:因為淺拷貝只拷貝了第一層,所以拷貝的變量和被拷貝的變量的第二層的列表的內(nèi)存地址是一樣的。
>>> import copy >>> name1 = ['a','b',['m','n'],'c'] >>> name2 = copy.copy(name1) >>> name1[0] = 'h' >>> name1[2][0] = 'M' #name1[2][0]的內(nèi)存地址和name2[2][0]內(nèi)存地址是一樣的 >>> print(name1,id(name1),id(name1[2][0])) ['h', 'b', ['M', 'n'], 'c'] 50209800 13820904 >>> print(name2,id(name2),id(name2[2][0])) ['a', 'b', ['M', 'n'], 'c'] 50891144 13820904
淺拷貝的三種表現(xiàn)形式:
1.用copy模塊中的copy方法(跟上面的一樣)
2.用切片的方式:
>>> name1 = ['a','b',['m','n'],'c'] >>> name2 = name1[:]
3.用列表自帶的方法:
>>> name1 = ['a','b',['m','n'],'c'] >>> name2 = name1.copy()
深拷貝(deepcopy)
深拷貝是指在內(nèi)存中將所有的數(shù)據(jù)重新創(chuàng)建一份。
注:排除最后一層,即python內(nèi)部對字符串和數(shù)字的優(yōu)化
>>> import copy >>> name1 = ['a','b',['m','n'],'c'] #深拷貝 >>> name2 = copy.deepcopy(name1) >>> print(name1,',',id(name1)) ['a', 'b', ['m', 'n'], 'c'] , 50142472 >>> print(name2,',',id(name2)) ['a', 'b', ['m', 'n'], 'c'] , 50942280 >>> name1[0] = 'h' >>> name1[2][0] = 'M' >>> print(name1,id(name1),id(name1[2][0])) ['h', 'b', ['M', 'n'], 'c'] 50142472 10937320 >>> print(name2,id(name2),id(name2[2][0])) ['a', 'b', ['m', 'n'], 'c'] 50942280 4896280
如圖所示:
注:因為深拷貝會拷貝到最后一層的內(nèi)存地址,所以最后一層的內(nèi)存地址是不通
二、循環(huán)方式
方法1、
for key in info: print(key,info[key])
方法2、
for k,v in info.items(): #會先把dict轉(zhuǎn)成list,數(shù)據(jù)量大時莫用 print(k,v)
小結(jié):
①方法1的效率比方法2的效率高很多
②方法1是直接通過key取value
③方法2是先把字典轉(zhuǎn)換成一個列表,再去取值
④當(dāng)數(shù)據(jù)量比較大的時候,用第二種方法時,字典轉(zhuǎn)換成列表的這個過程需要花大量的時間老轉(zhuǎn)換,當(dāng)然數(shù)據(jù)量不大,沒有關(guān)系,效率差不多
字典常用方法
更多關(guān)于Python字典深淺拷貝與循環(huán)方式方法請查看下面的相關(guān)鏈接
相關(guān)文章
Python實現(xiàn)常見坐標(biāo)系的相互轉(zhuǎn)換
WGS84坐標(biāo)系、GCJ02坐標(biāo)系、BD09坐標(biāo)系和Web?墨卡托投影坐標(biāo)系是我們常見的四個坐標(biāo)系。這篇文章為大家整理了這四個坐標(biāo)系之間相互轉(zhuǎn)換的方法,需要的可以參考一下2023-02-02使用python svm實現(xiàn)直接可用的手寫數(shù)字識別
這篇文章主要介紹了使用python svm實現(xiàn)直接可用的手寫數(shù)字識別,現(xiàn)在網(wǎng)上很多代碼是良莠不齊,真是一言難盡,于是記錄一下,能夠運(yùn)行成功并識別成功的一個源碼2021-08-08selenium?drag_and_drop不生效的解決辦法
本文主要介紹了selenium?drag_and_drop不生效的解決辦法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03python 實現(xiàn)將字典dict、列表list中的中文正常顯示方法
今天小編就為大家分享一篇python 實現(xiàn)將字典dict、列表list中的中文正常顯示方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07python命令行參數(shù)解析OptionParser類用法實例
這篇文章主要介紹了python命令行參數(shù)解析OptionParser類用法實例,需要的朋友可以參考下2014-10-10