# 代码一
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
辞書への最後の変更の値の値が優先します。リストは、同じメモリアドレスが含まれ、したがって、最終的なリストを生成するそれぞれの値のリストであり、同じです
- 第1辞書を開いて、メモリ内の通気領域に割り当てられた
シャローコピー、唯一のオブジェクト参照をコピーし、このような状況は、深いコピー解決することができます発生した
コンテンツの上にのみ個人的な見解ではなく、のような権威、外観を表して...