Pythonの辞書の注意事項

# 代码一
list1 = []
dict1 = {}
for i in range(5):
    dict1 = {"one": i}
    list1.append(dict1)
print(list1) # [{'one': 0}, {'one': 1}, {'one': 2}, {'one': 3}, {'one': 4}]

# 看一下列表的id值
for id_value in map(lambda x: id(x), list1):
    print(id_value)
私は理解して
  • ループの外で空の辞書と変数と代入を作成します。我々は、Pythonで、オブジェクトは実際にオブジェクトの割り当て、別の変数代入1つの変数、アドレスの転送ので、意志への参照であることを知ってdict1、この変数と{}一緒にバンドル空の辞書、またはdict1ポインティング{}

  • たびに辞書がで作成されたループのための{"one": i}辞書を格納するために使用されるメモリに新たなスペースを開き、割り当てのそれぞれと意志dict1の新しい辞書を指すように、この変数として{"one":0}

  • 次にlist1行うのappend操作を、私は(すでに確認された)追加操作が行われると思い、実際に追加される该对象的引用たびに、着信の(参照)メモリアドレス各辞書を追加しますので、list1

  • ID(それはオブジェクトを一意に識別するために返すことができます)、内部への注意を払うIDは同じではありませんlist1['1593305955784','1593305955496','1593306802432'...]

  • リストは、様々な辞書のメモリアドレスを含む、このようにして最終的なリストを生成するそれぞれの値のリストは同じではありませんです

 
 
 

# 代码二
list2 = []
dict2 = {}
for i in range(5):
    dict2["one"] = i
    print(dict2) # 依次输出 {'one': 0},{'one': 1},{'one': 2},{'one': 3},{'one': 4}
    list2.append(dict2)
print(list2) # [{'one': 4}, {'one': 4}, {'one': 4}, {'one': 4}, {'one': 4}]

# 看一下列表的id值
for id_value in map(lambda x: id(x), list1):
    print(id_value)

私は理解して

  • 見ることができ、出力、dict2["one"] = i辞書はちょうどたびにdict2最後の修正の最終結果を変更するには、コードのように、新たな辞書として保持し、そしてません
  • プロセスを分析してみてください
    • 第1辞書を開いて、メモリ内の通気領域に割り当てられたdict2(参照)
       
    • 各サイクルの変更dict2片尖った領域
       
    • dict2メモリは辞書メモリにアドレスAPPENDで指さlist2
       
    • しかし、すべての時間dict2["one"] = iと新しい辞書は、辞書に常にあるvalueたびに追記が同じメモリアドレスであるので、辞書は唯一、最後に開始され、書き換え、および無新しい辞書
       
    • 私たちは、このリストを見て使用することができ、ID['2966419766368','2966419766368','2966419766368'...]それ見つけ、idが同じです
       
    • 唯一つのキー、値にキーを複数回に値が対応するので、後者の値は、フロントが上書きされ、最終的な理由list2辞書への最後の変更の値の値が優先します。リストは、同じメモリアドレスが含まれ、したがって、最終的なリストを生成するそれぞれの値のリストであり、同じです

 
シャローコピー、唯一のオブジェクト参照をコピーし、このような状況は、深いコピー解決することができます発生した
 
 
コンテンツの上にのみ個人的な見解ではなく、のような権威、外観を表して...

おすすめ

転載: www.cnblogs.com/NoTrace/p/12580652.html