ホームページ >バックエンド開発 >Python チュートリアル >`dict.fromkeys()` が Python で共有可変オブジェクトを作成するのはなぜですか?

`dict.fromkeys()` が Python で共有可変オブジェクトを作成するのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-25 16:27:02258ブラウズ

 Why does `dict.fromkeys()` create shared mutable objects in Python?

辞書の作成と可変オブジェクト: 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。