私はこのスニペットを持っています:
a = [1,2,3]
b = a
b = [4,5,6] # a doesnt change
この:
a = [1,2,3]
b = a
b[0] = 5 # a also changes
の初期化は、 の可変性を決定する際にどのようb
な役割を果たしていa
ますか?
私はこのスニペットを持っています:
a = [1,2,3]
b = a
b = [4,5,6] # a doesnt change
この:
a = [1,2,3]
b = a
b[0] = 5 # a also changes
の初期化は、 の可変性を決定する際にどのようb
な役割を果たしていa
ますか?
リストを作成して変数に割り当てると、
a = [1, 2, 3]
オブジェクトを作成すると、変数 a はそのオブジェクトへの参照を保持します。あなたがするとき
b = a
b に同じ参照を割り当てると、a と b の両方がリストを指します。したがって、実行すると
b[0] = 5
その同じリストを変更します。
オブジェクトのメモリ アドレスを返す id() 関数を使用して、これを実際に確認できます。
>>> a = [1, 2, 3]
>>> b = a
>>> id(a), id(b)
(140454191340720, 140454191340720)
それらは同一です。ポイントは、a と b はリスト自体ではなく、リストを指しているということです。
次のようなことをすると:
a = [1, 2, 3]
b = a
b = [2, 3, 4]
最初に、a が指すリストへの参照を ba に割り当てましたが、その後、それに新しい参照を割り当てました。
ちなみに、これは、
def foo (a=[]):
a.append(42)
return a
引数 a はすべての呼び出しで同じリストを指しているため、この関数を引数なしで 5 回呼び出すと、リストには 5x 42 が含まれます。
foo(); foo(); foo(); foo();
print(foo())
>>> [42, 42, 42, 42]