Python におけるネストされたリストの可変性の混乱
はじめに:
Python における一般的な問題ネストされたリストを扱うときに発生します。サブリストに加えられた変更は、外側のリスト内の他のすべてのサブリストに予期せず影響を与えます。この予期しない動作は、リストの作成と可変性の基礎となるメカニズムに起因します。
問題:
次のコードを考えてみましょう:
xs = [[1] * 4] * 3
これコードは、各サブリストに 4 つの 1 が含まれるリストのリストを作成します。ただし、以下に示すように、最も内側の要素の 1 つを変更すると、すべてのサブリストに影響します:
xs[0][0] = 5
最初のサブリストの最初の要素のみを変更するのではなく、すべてのサブリストのすべての最初の要素が 5 に変更されます。
理由:
この動作を理解するための鍵は方法にありますPython はシーケンスを乗算します。既存のリスト [x] で * 演算子を使用する場合、新しいリストは作成されません。代わりに、同じリスト オブジェクトへの複数の参照が作成されます。
その結果、コード xs = [[1] * 4] * 3 では、式 [1] * 4 が 1 回評価され、3 回評価されます。その単一のリストへの参照は、外側のリストに割り当てられます。これは、すべてのサブリストが同じオブジェクトであることを意味します。
解決策:
独立したサブリストを作成するには、リスト内包表記を使用できます:
xs = [[1] * 4 for _ in range(3)]
この場合、リスト内包表記は反復ごとに [1] * 4 式を再評価し、結果として 3 つの式が得られます。
整数の不変性:
Python の整数は不変、つまり値を変更できないことに注意することが重要です。したがって、* 演算子が同じリストへの複数の参照を作成しても、そのリスト内の整数値は影響を受けません。
以上が入れ子になった Python リスト内のサブリストを変更すると、すべてのサブリストに影響するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。