「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > `dict.fromkeys()` が Python で共有可変オブジェクトを作成するのはなぜですか?

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

2024 年 11 月 8 日に公開
ブラウズ:778

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

辞書の作成と可変オブジェクト: fromkeys による驚くべき動作

Python で dict.fromkeys() を使用して辞書を作成すると、予期しない状況が発生する可能性があります。変更可能なオブジェクトが値として使用される場合に発生します。次の例を考えてみましょう:

xs = dict.fromkeys(range(2), [])
xs[0].append(1)
print(xs)

ディクショナリ キー 0 と 1 の値として 2 つの別個のリスト オブジェクトを作成しているにもかかわらず、インデックス 0 のリストに要素を追加すると、インデックス 1 のリストにも要素が追加されます。これは、fromkeys バインドが原因で発生します。各キーは可変オブジェクトの同じ参照に設定され、変更が共有されます。

対照的に、Python 3.2 の辞書内包表記は異なる動作を示します。

xs = {i: [] for i in range(2)}
xs[0].append(1)
print(xs)

ここでは、各キーが個別のリスト オブジェクトにバインドされています。インデックス 0 のリストに要素を追加しても、インデックス 1 のリストには影響しません。

なぜ違いますか?

fromkeys の動作は、次の同等のコード:

a = []
xs = dict.fromkeys(range(2), a)

結果の辞書内の各キーは同じオブジェクトを参照し、観察された共有変更につながります。

目的の動作を実現するにはキーごとに異なる可変オブジェクトを使用するには、辞書内包表記を使用するか、辞書内包表記のない Python 2.6 以前の場合は、ジェネレーター式を指定した dict() を使用します。

xs = dict((i, []) for i in range(2))
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3