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 の動作の明らかな理由は、結果の辞書内の各エントリが同じオブジェクトを参照していることです。 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 サイトの他の関連記事を参照してください。