阿神2017-04-17 16:41:44
まず最初に、3 つのことを知っておく必要があります。
1. プログラムを実行するには、メモリ内のアドレスを申請する必要があります。
2. 代入操作はメモリ内の特定のアドレスへの参照のみです。
3. Python の組み込み id() 関数。 この関数は概念的に、現在のライフのメモリ アドレスを取得するものとして理解できます。
id(object)
オブジェクトの「ID」を返します。これは、そのオブジェクトの存続期間中、一意で一定であることが保証される整数です。重複しない存続期間を持つ 2 つのオブジェクトは、同じ ID を持つことができます。 () 値。CPython 実装の詳細: これはメモリ内のオブジェクトのアドレスです。
これから、次の結果が得られます:
リーリーこれに基づいて辞書/辞書を調べます:
辞書 info = {} 操作を宣言すると、辞書はメモリ内の特定のアドレスをすでに取得しています。
info['name'] = 'github' など、辞書を操作する場合、辞書は以前に占有していたアドレスのままです。
次のコードは id 関数を通じてトレースできます:
したがって、改善前のコード
では、 pathlist.append(info) が追加するのは常に同じ情報であり、正確には、常に同じアドレスであり、この情報の内容は常に変更されます。
次のコードを参照してください:
次に、改良されたコード
では、info = {} 操作がループ内に配置されます。その結果、各ループは新しいアドレスに適用されますが、依然として info によって参照されます。
次のコードと比較できます:
2 回出力された値は等しくありません。
さらに
最初のコードのpathlist.append(info) #Add dict to the list
このコメント、多すぎます 多すぎます 私がいなくなってしまいました。
これがお役に立てば幸いです。
PHP中文网2017-04-17 16:41:44
listDirector は最終的に
を返します リーリー情報はループするたびに更新されますが、最終的には
リーリーそういう結果になるでしょう
更新されたコードはより直感的です。
info が新しく生成されるたびに、各ループの結果が追加されます。