ホームページ  >  記事  >  バックエンド開発  >  可変値を含む `dict.fromkeys` が共有オブジェクトを作成するのはなぜですか?

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

Susan Sarandon
Susan Sarandonオリジナル
2024-10-26 03:16:27248ブラウズ

Why Does `dict.fromkeys` With Mutable Values Create Shared Objects?

fromkeys を使用した可変オブジェクトと辞書の作成

dict.fromkeys を使用してリストなどの可変オブジェクトを含む辞書を作成するときに観察される動作最初は驚くかもしれません。次の例は、この問題を示しています。

<code class="python">xs = dict.fromkeys(range(2), [])
xs[0].append(1)
print(xs)  # Outputs: {0: [1], 1: [1]}</code>

この場合、2 つのキー (0 と 1) と各値の空のリストを持つ辞書を作成します。ただし、キー 0 に関連付けられたリストに要素を追加すると、その要素はキー 1 に関連付けられたリストにも表示されます。

この動作を理解するには、dict.fromkeys が同じ値オブジェクトを共有していることに注意することが重要です。すべてのキーの間。この例では、以下に示すように、xs[0] と xs[1] の両方が同じリスト オブジェクトを指します。

<code class="python">print(xs[0] is xs[1])  # Outputs: True</code>

したがって、xs[0] を通じてリストに加えられた変更も反映されます。 xs[1] では、同じ基礎となるオブジェクトを参照しているためです。

対照的に、辞書内包表記を使用して可変オブジェクトを含む辞書を作成すると、各値が別個のオブジェクトになります:

<code class="python">xs = {i: [] for i in range(2)}
xs[0].append(1)
print(xs)  # Outputs: {0: [1], 1: []}</code>

この場合、xs[0] と xs[1] は同じオブジェクトではないため、xs[0] を変更しても xs[1] には影響しません。

Python 2.6 以前では、辞書内包表記が使用される場合、が利用できない場合は、dict() でジェネレーター式を使用して、辞書内包表記と同じ動作を実現できます。

<code class="python">xs = dict((i, []) for i in range(2))</code>

以上が可変値を含む `dict.fromkeys` が共有オブジェクトを作成するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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