Python でネストされたリストを変更すると予期しない結果が生じるのはなぜですか?

Patricia Arquette
リリース: 2024-10-30 04:12:02
オリジナル
621 人が閲覧しました

Why Does Modifying a Nested List in Python Lead to Unexpected Results?

ネストされたリストのインデックスの再考

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>
ログイン後にコピー

意図された目的は、次の値が含まれる 2D リストを作成することです。各インデックス (最初の行と最初の列を除く) は 1 に設定されます。しかし、コードはこれを達成できません。代わりに、すべての行と列が 1 で埋められたリストが生成されます。

説明:

この問題の根本原因は、リストを渡す Python の方法にあります。参照。基本的な値型とは異なり、リストは同じメモリ位置への参照として渡されます。これは、1 つのリスト変数に加えられた変更は、同じリストを参照する他のすべての変数に反映されることを意味します。

指定されたコードの行 some_list = 4 * [(4 * [0])] は、単一の 0 値を 4 回含むリスト。ただし、4 つの異なるリストは作成されません。代わりに、同じ 0 値を指す 4 つの参照を持つ単一のリストを作成します。

その結果、コードがループの最初の反復で [i 1][j 1] の値を更新すると、他のすべての参照が指す値を変更します。これは、すべての要素が値 1 になる理由を説明しています。

解決策:

この問題を解決し、それぞれに独自の値セットを持つ 4 つの異なるリストを作成するには、次のようにします。 2 番目の乗算を避ける必要があります。これを行う 1 つの方法は、ループを使用してリストの各行を個別に初期化することです。

<code class="python">some_list = [(4 * [0]) for _ in range(4)]</code>
ログイン後にコピー

range(4) をループすることにより、このコードは、それぞれに個別の値のセットを持つ 4 つの異なるリストを作成します。 。その結果、その後リスト値を変更しても、他の行には影響しません。

以上がPython でネストされたリストを変更すると予期しない結果が生じるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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