3

私はPythonの初心者であり、可変性については非常にわかりにくく、直感的ではありません。リストが与えられた場合:

lst = [[1, 2, 3], [4, 5, 6]]

そして、for ループ内でリストを変更しようとしています。

for i in lst:
    i = "test"

これによりリストが変更されないことを理解しています。しかし:

for i in lst:
    i[1] = "test"

サブリストを参照すると、次の結果が得られたことに驚きました。

[[1, 'test', 3], [4, 'test', 6]]

ビジュアライザーで理解しようとしましたが、わかりません。誰か平易な言葉で説明してくれませんか?ありがとうございました。

4

4 に答える 4

4

最初のケースでは、要素への参照をコピーしただけです。

i ---> lst[n]

後者の場合、参照を逆参照し、データを変更しています (コピーではありません)。

i[i] ---> lst[n][i]

したがって、への割り当てi[n]は、そのコピーではなく、実際の可変オブジェクトを指します。

于 2012-12-15T02:35:27.743 に答える
3

代入 (=オペレーターが行うこと) は、名前に値を代入します。

iローカル名前空間の変数名です。for ループ内で実行するときは、リストを参照します。それに文字列を割り当てることで、名前がリストを参照するのではなく、文字列を参照するようになります。リストは影響を受けません。変更されるのは、名前に関連付けられた値だけです。

i[1]iその時点での設定に応じて、2 つのリストのいずれか内の特定の場所を指定する名前です。それに文字列を割り当てることにより、その名前は、リスト内のそのスペースを以前占有していたオブジェクト (整数、2または5リストに応じて) を参照しなくなり、代わりに文字列を参照します。整数は影響を受けません。変更されるのは、名前に関連付けられた値だけです。

したがって、いずれの場合も、代入は同じことを行っています。名前が参照していた古いものではなく、新しいものを参照するようにします。違いは、2 番目のケースは可変オブジェクトのプロパティを参照するという点で特別な名前であることです。

于 2012-12-15T02:40:24.683 に答える
2

for得られる各要素のコピーは作成しません。そのため、生成されたオブジェクトは、変更可能性を含め、オリジナルのすべてのプロパティを保持します (オリジナルであるため)。

于 2012-12-15T02:34:30.940 に答える
0

文字列の場合のforループは、lstのfor iのように別の方法で呼び出されるため、次のようになります。

これは、lstが文字列のリストまたは配列である場合、iはx [i]の値を直接参照することを意味します。そのため、最初のケースでは、「lst」の長さが2であったため、結果は2回「テスト」されました。

2番目の場合、i[1]はiを意味します------lst [i] i [1] -------- `-lst[i][1]は最初の値がlst[0][に等しいことを意味します1] --- [1、'test'、3]2番目の値はlst[1] [1]-[4、'test'、6]に等しい

于 2012-12-15T09:55:39.420 に答える