在python中list1 = [] list2 = []和list1 = list2 = []之间有什么区别?

时间:2013-10-04 20:04:14

标签: python list list-comprehension

我刚开始使用python,我正在尝试使用列表推导来初始化两个列表。喜欢这个

list1 = list2 = [0.0] * 57

当我这样做并插入带有值的列表时,我得到的是一组不同的值(不正确的值),当我与单独初始化这些列表时得到的值相比较时。像

list1 = [0.0] * 57
list2 = [0.0] * 57

第一种情况发生了什么?为什么我会为这两种情况得到不同的答案?

2 个答案:

答案 0 :(得分:6)

第一个设置list1list2都指向相同的列表。第二个为每个名称定义一个新列表。

答案 1 :(得分:4)

在下面的例子中,您将创建一个列表并使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

换句话说,int s(也不是float s和str等)没有方法可以更改您调用方法的值;相反,它们都返回该类型的新实例;所以-5返回一个新的int -5而不是现有的int 5修改过的;另外,a += 2相当于a = a + 2,其中a + 2(即a上调用的方法__add__)返回一个值为a + 2的新int,以及一个引用被分配回a