1

私はこのスニペットを持っています:

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ますか?

4

1 に答える 1

3

リストを作成して変数に割り当てると、

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]
于 2013-05-24T09:37:45.750 に答える