ホームページ  >  に質問  >  本文

[Python]list.append()在for循环中每次添加的都是最后的一个元素

迷茫迷茫2764日前578

全員に返信(2)返信します

  • 阿神

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

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

    返事
    0
  • PHP中文网

    PHP中文网2017-04-17 16:41:44

    元のコード

    listDirector は最終的に

    を返します リーリー

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

    リーリー

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

    コードを更新

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

    返事
    0
  • キャンセル返事