在以下情况下,您将创建一个列表并让 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
而这会创建 2 个新列表并将一个分配给 list1,另一个分配给 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
换句话说,ints(也不是floats 或strs 等)没有方法可以更改您调用该方法的值;相反,它们都返回该类型的新实例;所以 -5 返回一个新的 int -5 而不是现有的 int 5 修改;此外,a += 2 等价于 a = a + 2,其中 a + 2(即在 a 上调用的方法 __add__)返回一个新的 int,其值为 a + 2,并且对它的引用被分配回 a。