Python中使用遍歷在列表中添加字典遇到的坑
""" 已知列表li = [{"key": 5}, {"key": 9}, {"key": -1}, {"key": 4}] , 定義一個(gè)函數(shù),將該列表按照其元素的value 值進(jìn)行排序,并輸出結(jié)果 """
思路很清晰,新建一個(gè)列表,然后遍歷取出字典的值加入到新的列表中,再通過遍歷,賦值字典,使用append方法依次添加到列表,這樣就是一個(gè)按照value值排續(xù).于是有了下面的代碼:
li = [{"key": 5}, {"key": 9}, {"key": -1}, {"key": 4}] def fun(li): li_1 = [] # 接收value值 li_2 = [] # 接收新的字典 dict_1 = {} for i in range(len(li)): li_1.append(li[i]["key"]) li_1.sort() # 排序 for i in li_1: dict_1["key"] = i print(dict_1) li_2.append(dict_1) return li_2 print(fun(li))
但是運(yùn)行的結(jié)果卻是:
[{'key': 9}, {'key': 9}, {'key': 9}, {'key': 9}]
很明顯,取值被最后一個(gè)傳入value的9全部替換了.為什么會(huì)這樣呢?
開始懷疑是不是和字典中重復(fù)賦值給"key"有關(guān),但是也不應(yīng)該啊,每次遍歷的時(shí)候就是已經(jīng)把字典append到list中去了啊!
于是使用print(id(dict_1)),查看內(nèi)存信息,發(fā)現(xiàn)這個(gè)現(xiàn)象:
2874566784272
2874566784272
2874566784272
2874566784272
居然都是同一地址!!再查看list中的每個(gè)元素地址:
for i in li_2: print(id(i))
結(jié)果:(print(id(dict_1))也打印了)
2501747356944
2501747356944
2501747356944
2501747356944
2501747356944
2501747356944
2501747356944
2501747356944
于是明白了,因?yàn)槊看翁砑拥亩际峭粋€(gè)內(nèi)存到list中去了,dict_1每次寫入的時(shí)候改變了內(nèi)存中的value,但是地址不變,即是,創(chuàng)建了一次內(nèi)存空間,只會(huì)不斷的改變value了.完善方法:每次遍歷時(shí)候創(chuàng)建一個(gè)新的dict_1.
代碼:
def fun(li): li_1 = [] li_2 = [] for i in range(len(li)): li_1.append(li[i]["key"]) li_1.sort() # 排序 for i in li_1: dict_1 = {} # 每次遍歷時(shí)創(chuàng)建一個(gè)新的內(nèi)存 dict_1["key"] = i li_2.append(dict_1) return li_2 print(fun(li))
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
相關(guān)文章
Python attrs提高面向?qū)ο缶幊绦试敿?xì)
Python是面向?qū)ο蟮恼Z言,一般情況下使用面向?qū)ο缶幊虝?huì)使得開發(fā)效率更高,軟件質(zhì)量更好,并且代碼更易于擴(kuò)展,可讀性和可維護(hù)性也更高,但是Python的類寫起來是真的累,這是可以在創(chuàng)建類的時(shí)候自動(dòng)添加上attrs模塊,下面文章我們就來介紹這個(gè)東西,需要的朋友可參考一下2021-09-09Python庫textract提取各種文檔類型中文本數(shù)據(jù)
Python的textract庫是一個(gè)強(qiáng)大的工具,它可以從各種文檔類型中提取文本數(shù)據(jù),無論是PDF、Word文檔、圖片還是其他格式的文件,textract都可以輕松地將文本提取出來,本文將詳細(xì)介紹textract的功能和用法,并提供豐富的示例代碼來幫助大家深入了解2024-01-01python游戲?qū)崙?zhàn)項(xiàng)目之俄羅斯方塊的魅力
遲早一定會(huì)掛掉的俄羅斯方塊,為什么至今仍是世界游戲之王?它是怎么編寫的?本文將給大家詳細(xì)的介紹,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值2021-09-0910個(gè)python3常用排序算法詳細(xì)說明與實(shí)例(快速排序,冒泡排序,桶排序,基數(shù)排序,堆排序,希爾排序,歸并排序,計(jì)數(shù)排
這篇文章主要介紹了10個(gè)python3常用排序算法詳細(xì)說明與實(shí)例,需要的朋友可以參考下2020-03-03OpenCV 使用imread()函數(shù)讀取圖片的六種正確姿勢
這篇文章主要介紹了OpenCV 使用imread()函數(shù)讀取圖片的六種正確姿勢,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07