ホームページ > バックエンド開発 > Python チュートリアル > 入れ子になった Python リスト内のサブリストを変更すると、すべてのサブリストに影響するのはなぜですか?

入れ子になった Python リスト内のサブリストを変更すると、すべてのサブリストに影響するのはなぜですか?

Barbara Streisand
リリース: 2024-12-29 07:50:12
オリジナル
321 人が閲覧しました

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

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート