ホームページ >バックエンド開発 >Python チュートリアル >Python でネストされたリストを変更すると、すべてのサブリストに予期せず影響が及ぶのはなぜですか?
入れ子になったリストの突然変異: 予期せぬ動作を理解する
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 サイトの他の関連記事を参照してください。