Python列表中存放字典遇到的問題及處理
列表中存放字典遇到的問題
使用列表、字典之間的相互嵌套可以很容易的實(shí)現(xiàn)json數(shù)據(jù)格式,但是昨天在往列表中裝入字典時(shí)遇到了問題:
直接使用append方法將字典添加到列表中,如果需要更改字典中的數(shù)據(jù),那么列表中的內(nèi)容也會(huì)發(fā)生改變,這是因?yàn)閐ict在Python里是object,不屬于primitive type(即int、float、string、None、bool)。
這意味著你一般操控的是一個(gè)指向object(對(duì)象)的指針,而非object本身。
下面是改善方法:使用copy()
列表和字典的存儲(chǔ)方式
數(shù)組如何存儲(chǔ)?
數(shù)組底層的存儲(chǔ)結(jié)構(gòu)是順序存儲(chǔ)結(jié)構(gòu),這樣的結(jié)構(gòu)有這樣一些優(yōu)點(diǎn):邏輯上相鄰的節(jié)點(diǎn)在物理位置上也是相鄰的,可以節(jié)省空間,并且可以實(shí)現(xiàn)隨機(jī)存?。ㄒ卜Q直接訪問)。創(chuàng)建一個(gè)數(shù)組時(shí),會(huì)在內(nèi)存中開辟一塊固定長(zhǎng)度的區(qū)域用于直接存儲(chǔ)元素,擴(kuò)容要考慮這塊區(qū)域的后面是否有存儲(chǔ)其他對(duì)象,所以數(shù)組在定義好之后就無法擴(kuò)容了。而且在查詢時(shí),是根據(jù)索引和元素存儲(chǔ)大小去計(jì)算地址偏移量的,如果元素類型不一致,所占內(nèi)存空間不相同,就不能實(shí)現(xiàn)隨機(jī)存儲(chǔ),所以數(shù)組不能同時(shí)存儲(chǔ)不同類型的數(shù)據(jù);
列表如何存儲(chǔ)?
列表本質(zhì)是動(dòng)態(tài)的數(shù)組,列表存儲(chǔ)的是每個(gè)元素在內(nèi)存中的地址(即引用),當(dāng)列表中空白占位低于1/3時(shí),會(huì)在內(nèi)存中開辟一塊更大的空間,并將舊列表中存儲(chǔ)的地址復(fù)制到新列表中,舊列表則被銷毀,這樣就實(shí)現(xiàn)了擴(kuò)容。
因?yàn)榱斜泶鎯?chǔ)的是元素的引用這個(gè)特性,而引用所占的內(nèi)存空間是相同的,這樣便可以同時(shí)存放不同類型的數(shù)據(jù)了。
Python中的列表與數(shù)組的區(qū)別在于:
- 數(shù)組定義好之后就無法擴(kuò)容了,而列表在定義好之后可以擴(kuò)容;
- 數(shù)組只能同時(shí)存儲(chǔ)一種類型的數(shù)據(jù),而列表可以同時(shí)存儲(chǔ)不同類型的數(shù)據(jù)。
字典如何存儲(chǔ)?
Python中的字典底層是通過散列表(哈希表)來實(shí)現(xiàn)的, “哈希表是根據(jù)關(guān)鍵碼值(Key value)而直接進(jìn)行訪問的數(shù)據(jù)結(jié)構(gòu)。也就是說,它通過把關(guān)鍵碼值映射到表中一個(gè)位置來訪問記錄,以加快查找的速度。這個(gè)映射函數(shù)叫做散列函數(shù),存放記錄的數(shù)組叫做散列表。”
字典本質(zhì)也是一個(gè)數(shù)組,但其索引是鍵經(jīng)過散列函數(shù)處理后得到的散列值,散列函數(shù)的目的是使鍵均勻地分布在散列表中,并且可以在內(nèi)存中以O(shè)(1)的時(shí)間復(fù)雜度進(jìn)行尋址,從而實(shí)現(xiàn)快速查找和修改。散列表其實(shí)是一個(gè)稀疏數(shù)組(總是有空白元素的數(shù)組稱為稀疏數(shù)組),散列表里的單元通常叫作表元。在字典的散列表當(dāng)中,每個(gè)鍵值對(duì)都占用一個(gè)表元,每個(gè)表元都有兩個(gè)部分,一個(gè)是對(duì)鍵的引用,另一個(gè)是對(duì)值的引用。散列表中散列函數(shù)的設(shè)計(jì)困難在于將數(shù)據(jù)均勻分布在散列表中,從而盡量減少散列碰撞和沖突。
字典如何添加和查詢?
添加:Python 調(diào)用內(nèi)部的散列函數(shù),將鍵(Key)作為參數(shù)進(jìn)行轉(zhuǎn)換,得到一個(gè)唯一的地址(這也就解釋了為什么給相同的鍵賦值會(huì)直接覆蓋的原因,因?yàn)橄嗤逆I轉(zhuǎn)換后的地址是一樣的),然后將值(Value)存放到該地址中。
查詢:使用散列函數(shù)將key轉(zhuǎn)換為數(shù)組的下標(biāo),并定位到數(shù)組對(duì)應(yīng)位置獲取value。
字典為什么是無序的?
1.鍵值的哈希碰撞,hash(key1) == hash(key2)時(shí),向字典里連續(xù)添加的這個(gè)兩個(gè)鍵的順序是不可以控制的,也是無法做到連續(xù)的,后來的鍵會(huì)按算法調(diào)整到其它位置。
序是不可以控制的,也是無法做到連續(xù)的,后來的鍵會(huì)按算法調(diào)整到其它位置。
2.字典空間擴(kuò)容,當(dāng)鍵的數(shù)量超過字典默認(rèn)開的空間時(shí),字典會(huì)做空間擴(kuò)容,擴(kuò)容后的鍵順和創(chuàng)建順序就會(huì)發(fā)生變化,不受人為控制。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用pycharm和pylint檢查python代碼規(guī)范操作
這篇文章主要介紹了使用pycharm和pylint檢查python代碼規(guī)范操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-06-06VS2022安裝Python開發(fā)環(huán)境的詳細(xì)過程
這篇文章主要介紹了VS2022安裝Python開發(fā)環(huán)境,文中用Python實(shí)現(xiàn)裴波那契數(shù)列,來感受一下Python的魅力,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08Tensorflow分類器項(xiàng)目自定義數(shù)據(jù)讀入的實(shí)現(xiàn)
這篇文章主要介紹了Tensorflow分類器項(xiàng)目自定義數(shù)據(jù)讀入的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-02-02python爬蟲用request庫處理cookie的實(shí)例講解
在本篇內(nèi)容里小編給大家整理的是一篇關(guān)于python爬蟲用request庫處理cookie的實(shí)例講解內(nèi)容,有需要的朋友們可以學(xué)習(xí)參考下。2021-02-02Django項(xiàng)目中實(shí)現(xiàn)使用qq第三方登錄功能
使用qq登錄的前提是已經(jīng)在qq互聯(lián)官網(wǎng)創(chuàng)建網(wǎng)站應(yīng)用并獲取到QQ互聯(lián)中網(wǎng)站應(yīng)用的APP ID和APP KEY。這篇文章主要介紹了Django項(xiàng)目中實(shí)現(xiàn)使用qq第三方登錄功能,需要的朋友可以參考下2019-08-08Python實(shí)現(xiàn)獲取內(nèi)網(wǎng)IP地址的方法總結(jié)
這篇文章主要為大家詳細(xì)介紹了五種利用Python語言實(shí)現(xiàn)獲取內(nèi)網(wǎng)IP地址的方法,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,需要的可以了解一下2023-03-03Python實(shí)現(xiàn)從URL地址提取文件名的方法
這篇文章主要介紹了Python實(shí)現(xiàn)從URL地址提取文件名的方法,涉及OS模塊中basename方法的使用技巧,需要的朋友可以參考下2015-05-05