辞書の作成と可変オブジェクト: fromkeys による驚くべき動作
Python で dict.fromkeys() を使用して辞書を作成すると、予期しない状況が発生する可能性があります。変更可能なオブジェクトが値として使用される場合に発生します。次の例を考えてみましょう:
<code class="python">xs = dict.fromkeys(range(2), []) xs[0].append(1) print(xs)</code>
ディクショナリ キー 0 と 1 の値として 2 つの別個のリスト オブジェクトを作成しているにもかかわらず、インデックス 0 のリストに要素を追加すると、インデックス 1 のリストにも要素が追加されます。これは、fromkeys が各キーを可変オブジェクトの同じ参照にバインドし、変更が共有されるために発生します。
対照的に、Python 3.2 の辞書内包表記は異なる動作を示します。
<code class="python">xs = {i: [] for i in range(2)} xs[0].append(1) print(xs)</code>
ここでは、それぞれキーは別個のリスト オブジェクトにバインドされます。インデックス 0 のリストに要素を追加しても、インデックス 1 のリストには影響しません。
なぜ違いますか?
fromkeys の動作は、次の同等のコード:
<code class="python">a = [] xs = dict.fromkeys(range(2), a)</code>
結果の辞書内の各キーは同じオブジェクトを参照し、観察された共有変更につながります。
キーごとに異なる可変オブジェクトの望ましい動作を実現するには、辞書内包表記を使用するか、辞書内包表記のない Python 2.6 以前の場合は、ジェネレータ式を指定して dict() を使用します:
<code class="python">xs = dict((i, []) for i in range(2))</code>
以上が`dict.fromkeys()` が Python で共有可変オブジェクトを作成するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。