次のケースでは、1 つのリストを作成し、2 つの変数がそれを指すようにしています。つまり、同じオブジェクトへの 2 つの参照:
list1 = list2 = [123] * 3
list1.append(456)
print list1 => # prints [123, 123, 123, 456]
print list2 => # prints [123, 123, 123, 456]
print list1 is list2 # prints True
list1
一方、これは 2 つの新しいリストを作成し、1 つをに、もう1 つを に割り当てますlist2
。
list1 = [123] * 3
list2 = [123] * 3
# or list1, list2 = [123] * 3, [123] * 3
list1.append(456)
print list1 # prints [123, 123, 123, 456]
print list2 # prints [123, 123, 123]
print list1 is list 2 # prints False
これは、値が参照によって変数にコピーされるか格納されるかに関係しています。整数や文字列などの不変オブジェクトの場合、これは問題になりません。
# a and b contain the same int object
# but it's OK because int's are immutable
a = b = 1
a += 2 # creates a new int from 1+2 and assigns it to `a`
print b # => 1 ... b is unchanged
print a # => 3
言い換えれば、int
s (またはfloat
s やstr
s など) には、メソッドを呼び出している値を変更するメソッドはありません。代わりに、それらはすべてその型の新しいインスタンスを返します。そのため、変更された既存の int ではなく、-5
新しい int を返します。また、is where (つまり、a で呼び出されたメソッド) は、値が である新しい int を返し、それへの参照が に割り当てられます。-5
5
a += 2
a = a + 2
a + 2
__add__
a + 2
a