ホームページ > バックエンド開発 > Python チュートリアル > 可変値を含む Python の `dict.fromkeys` が予期しない動作を引き起こすのはなぜですか?

可変値を含む Python の `dict.fromkeys` が予期しない動作を引き起こすのはなぜですか?

Patricia Arquette
リリース: 2024-10-25 15:56:02
オリジナル
340 人が閲覧しました

Why Does Python's `dict.fromkeys` With Mutable Values Cause Unexpected Behavior?

fromkeys と可変オブジェクトを使用した辞書の作成: 予期せぬ驚き

Python 2.6 および 3.2 では、可変オブジェクトを使用した dict.fromkeys の動作が驚くべきものになる可能性があります。リストが値として使用されている場合、以下に示すように、辞書内の 1 つのエントリを変更すると、他のすべてのエントリに影響します:

>>> xs = dict.fromkeys(range(2), [])
>>> xs
{0: [], 1: []}
>>> xs[0].append(1)
>>> xs
{0: [1], 1: [1]}
ログイン後にコピー

ただし、この動作は Python 3.2 の辞書内包表記では発生しません:

>>> xs = {i:[] for i in range(2)}
>>> xs
{0: [], 1: []}
>>> xs[0].append(1)
>>> xs
{0: [1], 1: []}
ログイン後にコピー

fromkeys の動作の理由

fromkeys の動作の明らかな理由は、結果の辞書内の各エントリが同じオブジェクトを参照していることです。 1 つのエントリを通じてオブジェクトを変更すると、他のすべてのエントリに影響します。これは、辞書を手動で作成することで明確にできます:

>>> a = []
>>> xs = dict.fromkeys(range(2), a)
ログイン後にコピー

これは、辞書エントリがすべて同じオブジェクトを参照していることを示しています:

>>> xs[0] is a and xs[1] is a
True
ログイン後にコピー

辞書内包表記による動作の軽減

この動作を回避するには、辞書内包表記を使用するか、Python 2.6 以前を使用している場合は、ジェネレーター式で辞書を使用します:

xs = dict((i, []) for i in range(2))
ログイン後にコピー

以上が可変値を含む Python の `dict.fromkeys` が予期しない動作を引き起こすのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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