[Python]list.append()在for循环中每次添加的都是最后的一个元素
迷茫
迷茫 2017-04-17 16:39:44
0
2
571
迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全員に返信(2)
阿神

まず最初に、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
このコメント、多すぎます 多すぎます がいなくなってしまいました。

これがお役に立てば幸いです。

いいねを押す +0
Ty80

元のコード

listDirector は最終的に

を返します リーリー

情報はループするたびに更新されますが、最終的には

リーリー

そういう結果になるでしょう

コードを更新

更新されたコードはより直感的です。
info が新しく生成されるたびに、各ループの結果が追加されます。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!