ネストされたリストのインデックス
Python では、リストのリストを使用してネストされたリストを作成できます。ただし、これらのリスト内の値を変更する場合、Python の参照処理が原因で一般的な落とし穴が発生します。
次のコードを考えてみましょう:
<code class="python">some_list = 4 * [(4 * [0])] for i in range(3): for j in range(3): some_list[i + 1][j + 1] = 1 for i in range(4): print(some_list[i])</code>
意図した出力は次のとおりです:
[0, 0, 0, 0] [0, 1, 1, 1] [0, 1, 1, 1] [0, 1, 1, 1]
ただし、実際の出力は次のとおりです。
[0, 1, 1, 1] [0, 1, 1, 1] [0, 1, 1, 1] [0, 1, 1, 1]
問題の理解
問題は some_list = 4 * [(4 * [0 ])]。ここで、[(4 * [0])] 式は 4 つの要素を含む単一のリストを作成します。各要素は 4 つのゼロを含むリストです。ただし、後続の乗算 4 * では、4 つの異なるリストではなく、同じリストへの 4 つの参照が作成されます。
その結果、some_list の 1 つの要素内で値が変更されると、他の要素にも影響します。すべてが同じ基礎となるリストを指します。この動作は、Python では参照渡しとして知られています。
解決策
この問題を解決し、some_list 内に独立したリストを作成するには、ループを使用して各サブリストを個別に作成できます。
<code class="python">some_list = [(4 * [0]) for _ in range(4)]</code>
このコードは、それぞれ 4 つのゼロを持つ 4 つの異なるリストを作成します。 1 つのサブリスト内の値を変更しても、他のサブリストには影響しなくなりました。
以上がPython のネストされたリストが同じ基礎データを共有するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。