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

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

Susan Sarandon
リリース: 2024-10-26 03:16:27
オリジナル
278 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート