ホームページ  >  記事  >  バックエンド開発  >  `dict.fromkeys()` が共有リストを作成するのはなぜですか?それを回避するにはどうすればよいですか?

`dict.fromkeys()` が共有リストを作成するのはなぜですか?それを回避するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-25 01:54:11203ブラウズ

Why Does `dict.fromkeys()` Create Shared Lists, and How Can I Avoid It?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。