Fromkeys の注意事項: 辞書の初期化の動作を理解する
Python では、辞書の作成に dict.fromkeys() メソッドがよく使用されます。指定されたキーを空のリストに割り当てます。しかし、その動作の誤解が予期せぬ結果をもたらしました。
fromkeys() が難しい理由
空のリスト [] が dict の 2 番目の引数として指定された場合.fromkeys() を使用すると、結果として得られる辞書内のすべての値は、同じ リスト オブジェクトを指します。これは、1 つの値を変更するとすべての値に影響することを意味します。
代替解決策
この問題に対処するには、次の解決策が推奨されます:
辞書を使用する内包表記:
Python 2.7 以降では、辞書内包表記が最も簡潔で読みやすい解決策です。
data = {k: [] for k in range(2)}
リスト内包表記を使用するとdict():
以前の Python バージョンでは、リスト内包表記を dict() コンストラクターに渡すことができます。
data = dict([(k, []) for k in range(2)])
を使用します。 dict():
を使用したジェネレーター式 (Python の場合) 2.4 ~ 2.6 では、ジェネレーター式は dict() で使用でき、括弧は省略できます。
data = dict((k, []) for k in range(2))
例
次の例は、fromkeys() のデフォルトの動作と推奨される動作の違いを示しています。ソリューション:
# Default behavior of fromkeys() data = {} data = data.fromkeys(range(2), []) data[1].append('hello') print(data) # Output: {0: ['hello'], 1: ['hello']} # Using a dictionary comprehension data = {k: [] for k in range(2)} data[1].append('hello') print(data) # Output: {0: [], 1: ['hello']}
fromkeys() のニュアンスを理解することで、開発者は空のリストの辞書を効果的に作成し、個々のキーのアドレス指定を維持できます。
以上が`dict.fromkeys()` が共有リストを作成するのはなぜですか?それを回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。