1. 程式人生 > 實用技巧 >Python遍歷字典到列表中出現覆蓋前面資料或者字典對值(值為列表)賦值出現重複的問題

Python遍歷字典到列表中出現覆蓋前面資料或者字典對值(值為列表)賦值出現重複的問題

1.遍歷字典

dict_list = [
    {'key': '1'},
    {'key': '9670'},
    {'key': 'Converse'},
    {'key': 'Converse All Star 70 高幫復古黑 1970s 2018新款'},
    {'key': '866248'},
    {'key': '2018'},
    {'key': '162050C'},
    {'key': '37900'}
]
def fun(dict_list):
    list_1 = [] # 接收value值
    list_2 = [] # 接收新的字典
    dict_info = {}
    for i in range(len(dict_list)):
        list_1.append(dict_list[i]["key"])
    list_1.sort() # 排序
    for i in list_1:
        dict_info["key"] = i
        print(dict_info)
        # 執行的結果是一樣的
        list_2.append(dict_info)

        # 列印地址
        for i in list_2:
            print("地址:",id(i))
    return list_2

print(fun(dict_list))

執行結果:
地址: 2275698218760
地址: 2275698218760
地址: 2275698218760
地址: 2275698218760
地址: 2275698218760
地址: 2275698218760
地址: 2275698218760
地址: 2275698218760
[{'key': '高幫復古黑 2018新款'}, {'key': '高幫復古黑 2018新款'}, {'key': '高幫復古黑 2018新款'}, {'key': '高幫復古黑 2018新款'}, {'key': '高幫復古黑 2018新款'}, {'key': '高幫復古黑 2018新款'}, {'key': '高幫復古黑 2018新款'}, {'key': '高幫復古黑 2018新款'}]

2.解決方法

因為每次新增的都是同一個記憶體到list中了,dict_info每次寫入的時候改變了記憶體中的value,
但是地址是不變,即,建立了一次記憶體空間,只會不斷的改變value.
完善方法:每次遍歷時候建立一個新的dict_new.

def fun(dict_list):
  list_1 = []
  list_2 = []
  for i in range(len(dict_list)):
    list_1.append(dict_list[i]["key"])
    list_1.sort()  # 排序
  for i in list_1:
    dict_new = {}  # 每次遍歷時建立一個新的記憶體
    dict_new["key"] = i
    list_2.append(dict_new)
  return list_2
print(fun(dict_list))

執行結果:
地址不相同
地址: 1941366120384
地址: 1941366052616
地址: 1941366052760
地址: 1941366052832
地址: 1941366052904
地址: 1941366052976
地址: 1941366053048
地址: 1941366120384
地址: 1941366120240
[{'key': '1'}, {'key': '162050C'}, {'key': '2018'}, {'key': '37900'}, {'key': '866248'}, {'key': '9670'}, {'key': 'Converse'}, {'key': '高幫復古黑 2018新款'}]