ホームページ >バックエンド開発 >Python チュートリアル >Python でネストされたリストを変更すると、すべてのサブリストに予期せず影響が及ぶのはなぜですか?

Python でネストされたリストを変更すると、すべてのサブリストに予期せず影響が及ぶのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-01 11:10:09948ブラウズ

Why Does Modifying a Nested List in Python Unexpectedly Affect All Sublists?

入れ子になったリストの突然変異: 予期せぬ動作を理解する

Python では、リストなどの変更可能なデータ構造は、入れ子になると予期しない動作をする可能性があります。リストのリストが作成される例を考えてみましょう。

xs = [[1] * 4] * 3

これは、各サブリストに 1 に設定された 4 つの要素が含まれる入れ子のリスト構造を初期化します。ただし、以下に示すように、これらの最も内側の値の 1 つを変更します。

xs[0][0] = 5

は、すべてのサブリストの最初の要素すべてに影響を与え、その結果、 in:

[[5, 1, 1, 1], [5, 1, 1, 1], [5, 1, 1, 1]]

予期せぬ動作の原因

問題の根本は、オブジェクトに適用されたときの * 演算子の動作にあります。この場合、行

[[1] * 4] * 3

は、3 つの独立したコピーを作成するのではなく、同じサブリスト [1] 4 への 3 つの参照を作成します。これは、 が単一のサブリストである式 [1] * 4 の評価結果を操作するためです。その結果、この単一のサブリストへの変更はすべての参照に反映されます。

問題の解決

独立したサブリストを作成するには、 [1] 各サブリストの * 4 式。これは、以下に示すように、リスト内包表記を使用して実現できます。

[[1]*4 for _ in range(3)]

この場合、[1]*4 式は毎回評価され、その結果、3 つの異なるサブリストが作成され、変更が行われます。 1 つのサブリストへの変更は、そのサブリストにのみ影響し、他のサブリストには影響しません。

以上がPython でネストされたリストを変更すると、すべてのサブリストに予期せず影響が及ぶのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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