>>> a = [1,2,3]
>>> b = a[:]
>>> id(a[0]) == id(b[0])
True
>>> b[0] = 99
>>> id(a[0]) == id(b[0])
False
浅いコピーを作成するには、スライスを使用できることと、コピー モジュールがあることを理解しています。しかし、なぜ "b" のインデックスに書き込むと ID が変わるのでしょうか。
>>> a = [1,2,3]
>>> b = a[:]
>>> id(a[0]) == id(b[0])
True
>>> b[0] = 99
>>> id(a[0]) == id(b[0])
False
浅いコピーを作成するには、スライスを使用できることと、コピー モジュールがあることを理解しています。しかし、なぜ "b" のインデックスに書き込むと ID が変わるのでしょうか。
b[0] = 99
原因はa[0] == b[0] >> False
?あなたの質問への答えはb[0] = 99
、「Bのフィールドの1つが指すメモリアドレスを変更する」のではなく、実際にBのフィールドの1つが指す場所を変更するということです。
a = [1,2,3]
a
オブジェクトへの参照が含まれるようになりました。これには、3 つのオブジェクトlist
への 3 つの参照が含まれint
ます。
b = a[:]
現在、b はlist
オブジェクト (参照先と同じものではない) を参照し、3 つのオブジェクトa
への 3 つの参照 (参照先と同じもの) を含んでいます。int
a
id(a) == id(b)
#False
とは異なるオブジェクトへの参照であるためa
、誤りです。b
list
id(a[0]) == id(b[0])
#True
確かに、はオブジェクトa[0]
への参照であり、 もそうです。オブジェクトは 1 つだけで、 と で参照されます。1
b[0]
1
a[0]
b[0]
b[0] = 99
# ^^^^^^ THIS IS NOT WHAT THE WIKIPEDIA ARTICLE IS DESCRIBING
b
は引き続き同じ古いlist
オブジェクトを参照しますが、b[0]
現在は99
オブジェクトを参照しています。参照先の参照の 1 つを別のオブジェクトへの新しい参照にlist
置き換えただけです。を指しているオブジェクトは変更されb
ていません!a
id(a[0]) == id(b[0])
#False
1
オブジェクトがオブジェクトと同じオブジェクトではないため、False 99
。
これは、実際に「B のフィールドの 1 つが指すメモリ アドレスを変更する」コピー操作の例です。これにより、コピーされたオブジェクトのその後の変更を確認できます。
a = [[1],[2],[3]]
a
はオブジェクトへの参照ですlist
が、現在、list
オブジェクトにはオブジェクトへの 3 つの参照がlist
含まれており、それぞれにオブジェクトへの参照が含まれていint
ます。
b = a[:]
以前と同様に、b
新しい別のlist
オブジェクトを参照しました。このオブジェクトは、 で参照されているのと同じ 3 つのlist
オブジェクトを参照していa
ます。証拠は次のとおりです。
id(a) == id(b)
# False
前a
と同じように、 とb
は異なるlist
オブジェクトへの参照であるため、誤りです。
id(a[0]) == id(b[0])
#True
前と同じように、 と の両方が同じオブジェクトa[0]
を参照するためです。b[0]
今回は、オブジェクトとは異なり、不変list
ではないオブジェクトです。オブジェクト の内容を実際に変更できます。ここが違うところです:int
list
b[0][0] = 99
やった - が参照するオブジェクトの内容を変更したlist
b[0]
a[0][0]
# 99 !!!!!!!!!!!!!! Wikipedia doesn't need to be edited!
見る?list
によって参照される「リスト」a
は、99
オブジェクトではなくオブジェクトを参照します。これは、 でアクセスし1
たものと同じであるためです。シンプルですね ;)list
b[0][0] = 99
id(a[0]) == id(b[0])
#True !!!
a[0]
確かに、参照先の内容は変更しましたが、参照自体は変更していません。これは、ウィキペディアの記事の「浅いコピー」セクションで説明されている内容に近いものです。a[0]
b[0]