Python中使用遍歷在列表中添加字典遇到的坑
"""
已知列表li = [{"key": 5}, {"key": 9}, {"key": -1}, {"key": 4}] ,
定義一個函數(shù),將該列表按照其元素的value
值進行排序,并輸出結果
"""
思路很清晰,新建一個列表,然后遍歷取出字典的值加入到新的列表中,再通過遍歷,賦值字典,使用append方法依次添加到列表,這樣就是一個按照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))
但是運行的結果卻是:
[{'key': 9}, {'key': 9}, {'key': 9}, {'key': 9}]
很明顯,取值被最后一個傳入value的9全部替換了.為什么會這樣呢?
開始懷疑是不是和字典中重復賦值給"key"有關,但是也不應該啊,每次遍歷的時候就是已經(jīng)把字典append到list中去了啊!
于是使用print(id(dict_1)),查看內(nèi)存信息,發(fā)現(xiàn)這個現(xiàn)象:
2874566784272
2874566784272
2874566784272
2874566784272
居然都是同一地址!!再查看list中的每個元素地址:
for i in li_2: print(id(i))
結果:(print(id(dict_1))也打印了)
2501747356944
2501747356944
2501747356944
2501747356944
2501747356944
2501747356944
2501747356944
2501747356944
于是明白了,因為每次添加的都是同一個內(nèi)存到list中去了,dict_1每次寫入的時候改變了內(nèi)存中的value,但是地址不變,即是,創(chuàng)建了一次內(nèi)存空間,只會不斷的改變value了.完善方法:每次遍歷時候創(chuàng)建一個新的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 = {} # 每次遍歷時創(chuàng)建一個新的內(nèi)存
dict_1["key"] = i
li_2.append(dict_1)
return li_2
print(fun(li))
總結
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內(nèi)容請查看下面相關鏈接
相關文章
python實現(xiàn)bitmap數(shù)據(jù)結構詳解
bitmap是很常用的數(shù)據(jù)結構,比如用于Bloom Filter中,下面是使用python實現(xiàn)bitmap數(shù)據(jù)結構的代碼講解,需要的朋友可以參考下2014-02-02
flask操作數(shù)據(jù)庫相關配置及實現(xiàn)示例步驟全解
這篇文章主要介紹了flask操作數(shù)據(jù)庫相關配置及實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2024-01-01
python中l(wèi)ogging模塊的一些簡單用法的使用
這篇文章主要介紹了python中l(wèi)ogging模塊的一些簡單用法的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-02-02

