什么';python中list1=[]list2=[]和list1=list2=[]之间的区别是什么?

什么';python中list1=[]list2=[]和list1=list2=[]之间的区别是什么?,python,list,list-comprehension,Python,List,List Comprehension,我刚开始使用python,我正在尝试使用列表理解初始化两个列表。像这样 list1 = list2 = [0.0] * 57 当我这样做并用值插入这些列表时,与单独初始化这些列表时得到的值相比,我得到了一组不同的值(不正确的值)。像 list1 = [0.0] * 57 list2 = [0.0] * 57 第一个病例发生了什么?为什么这两个案例的答案不同 第一个选项将list1和list2设置为都指向同一个列表。第二个列表为每个名称定义一个新列表。在下面的例子中,您创建一个列表,并使两个变

我刚开始使用python,我正在尝试使用列表理解初始化两个列表。像这样

list1 = list2 = [0.0] * 57
当我这样做并用值插入这些列表时,与单独初始化这些列表时得到的值相比,我得到了一组不同的值(不正确的值)。像

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

第一个病例发生了什么?为什么这两个案例的答案不同

第一个选项将
list1
list2
设置为都指向同一个列表。第二个列表为每个名称定义一个新列表。

在下面的例子中,您创建一个列表,并使两个变量指向它;i、 e.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
,另一个分配给
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(nor
float
s或
str
s等)没有方法可以更改调用该方法的值;相反,它们都返回该类型的新实例;因此
-5
返回一个新的int
-5
而不是现有的int
5
修改;另外,
a+=2
相当于
a=a+2
,其中
a+2
(即在a上调用的方法
\uuuuu add\uuuu
)返回一个新的int,其值为
a+2
,对该int的引用被分配回
a

,我的猜测是首先计算方程的RHS,然后计算LHS。不过我不知道解释器中的求值顺序。@squiguy不知道,这是因为两个变量都绑定到同一个list.Ohh。知道了。谢谢接下来,当使用num1=num2=num3=0.0这样的普通数字时,这种方法似乎工作得很好。除此之外,没有任何问题。为什么?@Pradep:number(以及字符串和其他一些数据类型)是不可变的。不能更改
0
的值,但可以更改列表的元素。这就是为什么这很重要。