![Why Does Modifying One Sublist Affect All Sublists When Using List Multiplication in Python?](https://img.php.cn/upload/article/000/000/000/173482705311439.jpg)
リストの変更がサブリスト間で予期せず反映される
Python では、[[1] 4] 3、1 つのサブリストへの変更がすべてのサブリストに影響する状況が発生します。この動作は直感に反し、予期しない結果を招く可能性があります。
説明
リスト乗算を使用する場合、新しいリストは元のリストへの参照になります。新しいリストの要素を変更すると、実際には、すべてのサブリストによって参照される元のリストの要素が変更されます。
この予期しない動作は、Python がリスト内包表記の前に乗算演算子
を評価するために発生します。 。この場合、[[1] 4] は 1 つのサブリストに評価され、 * 単純にそのサブリストへの 3 つの参照を作成します。
解決策
この動作を回避し、3 つの独立したサブリストを作成するにはサブリストでは、次のようにリスト内包表記を使用できます。
[[1] * 4 for _ in range(3)]
ログイン後にコピー
リスト内包表記各サブリストの [1] * 4 式を再評価し、リンクされていない 3 つの異なるサブリストが生成されます。
リスト乗算との比較
リスト乗算はリストを作成する便利な方法です。繰り返し要素がある場合は、その制限を理解することが重要です。リスト乗算は、式を参照せずに既存のオブジェクトに対して実行されます。オブジェクトのコピーを作成するのではなく、既存のオブジェクトへの参照を作成します。
対照的に、リスト内包表記は各要素の式を再評価し、必要に応じて新しいオブジェクトを作成します。この動作により、リスト内の各要素が独立していることが保証されます。
追加リソース
[作成後に予期せず変更されないようにリストを複製するにはどうすればよいですか?割り当て?](https://stackoverflow.com/questions/19850422/how-do-i-clone-a-list-so-that-it-doesnt-change-unexpectedly-after-assignment)- [2次元配列(NumPyを使用しない場合はリストのリスト)を初期化する方法Python?](https://stackoverflow.com/questions/6951326/how-to-initialize-a-two-digital-array-list-of-lists-if-not-using-numpy-in-pyt)
- [辞書のリストには、すべての辞書の最後に追加された値のみが格納されます。反復](https://stackoverflow.com/questions/10827325/list-of-dictionary-stores-only-last-appended-value-in-every-iteration)
-
以上がPython でリスト乗算を使用する場合、1 つのサブリストを変更するとすべてのサブリストに影響するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。