Python:forループでリスト(list)append辞書(dict)の最後のデータが繰り返される

7572 ワード

コードを先に入力:
num=[i for i in range(5)]
data=["a","b","c","d","e"]
json={}
collect=[]
for index,content in enumerate(data):
    json['name']=data[index]
    collect.append(json)
print(collect)

結果が出る
[{'name': 'e'}, {'name': 'e'}, {'name': 'e'}, {'name': 'e'}, {'name': 'e'}]

これは私が望んでいた結果とは違います.所望の結果はdata中のすべてのデータを遍歴して出るはずだ.
後で原因を探して、以下の原因と解決方法を理解しました.
理由:listは、ループごとにデータを保存する場所を追加します.しかしjson辞書はループ外で,その辞書に毎回再付与されるが,同じアドレスを指し,辞書に付与されるたびに前のすべてのデータの更新を引き起こす.そのため、データの重複が発生します.
解決方法1
num=[i for i in range(5)]
data=["a","b","c","d","e"]
json={}
collect=[]
for index,content in enumerate(data):
    json['name']=data[index]
    # collect.append(json.copy()) ,  copy()
    collect.append(json.copy())
print(collect)

解決策2
num=[i for i in range(5)]
data=["a","b","c","d","e"]
collect=[]
for index,content in enumerate(data):
    json['name']=data[index]
  
  
    collect.append(json)
      #  json        
     json={}
print(collect)