fromkeys と可変オブジェクトを使用した辞書の作成: 驚くべきひねり
Python の fromkeys メソッドは、キーのシーケンス。すべて指定された値にマップされます。ただし、変更可能なオブジェクトを値として使用すると、予期しない動作が発生する可能性があります。
The Curiosity
Python 2.6 および 3.2 での次の例を考えてみましょう:
<code class="python">xs = dict.fromkeys(range(2), []) xs[0].append(1) print(xs)</code>
驚いたことに、最初のキー ([0]) に関連付けられたリストを変更すると、2 番目のキー ([1]) に関連付けられたリストにも影響します。各キーには独自の独立した値があると予想されるため、これは不可解になる可能性があります。
The Revelation
この奇妙な動作の理由は、fromkeys メソッドが個別のコピーを作成するのではなく、同じ可変オブジェクトへの参照を含む新しい辞書を作成します。言い換えれば、すべての辞書エントリは、同じ基礎となる可変オブジェクトを指します。
解決策
この問題を回避するには、新しい辞書内包表記を作成する辞書内包表記を使用できます。各辞書キーのリスト:
<code class="python">xs = {i: [] for i in range(2)} xs[0].append(1) print(xs)</code>
Python 2.6 以前では、ジェネレーター式で dict() を使用することで同様の動作を実現できます:
<code class="python">xs = dict((i, []) for i in range(2))</code>
この代替メソッドでは、次のものも作成されます。ディクショナリ キーごとに個別のリストを作成します。
結論
可変オブジェクトを使用したディクショナリ作成の微妙な違いを理解することは、予期せぬ動作を防止し、Python コードでのデータの整合性を維持するために不可欠です。適切な方法を選択することで、辞書エントリが適切に分離され、望ましくない副作用を回避できます。
以上が可変オブジェクトを含む「fromkeys」が Python 辞書に共有値を作成するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。