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

Patricia Arquette
リリース: 2024-10-25 16:27:02
オリジナル
158 人が閲覧しました

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!