Python 奇怪的内联赋值

Python 奇怪的内联赋值,python,tuples,variable-assignment,Python,Tuples,Variable Assignment,在Python(2和3)中,我正在与这种奇怪的行为作斗争: 这导致: >>> a [1, 2] >>> a == [x, y] True 但是如果你写 >>> a = [1, 2] >>> a[a.index(1)], a[a.index(2)] = x, y 其中x,y!=2,1(可以是1,1,2,2,3,5,等等),这会导致: >>> a [1, 2] >>> a == [x,

在Python(2和3)中,我正在与这种奇怪的行为作斗争:

这导致:

>>> a
[1, 2]
>>> a == [x, y]
True
但是如果你写

>>> a = [1, 2]
>>> a[a.index(1)], a[a.index(2)] = x, y
其中
x,y!=2,1
(可以是
1,1
2,2
3,5
,等等),这会导致:

>>> a
[1, 2]
>>> a == [x, y]
True
正如人们所料。为什么
a[a.index(1)],a[a.index(2)]=2,1
不产生结果
a==2,1]

>>> a == [2, 1]
False

因为它实际上是这样解释的:

>>> a = [1, 2]
>>> a
[1, 2]
>>> a[a.index(1)] = 2
>>> a
[2, 2]
>>> a[a.index(2)] = 1
>>> a
[1, 2]
引用(我的重点):

  • 如果目标列表是以逗号分隔的目标列表:对象必须是一个iterable,其项数必须与目标数相同 在目标列表中,项目从左到右分配给 相应的目标
a[a.index(1)]
(即
a[0]
)的赋值发生在第二次赋值要求
a.index(2)
之前,此时
a.index(2)==0

您将在任何作业中看到相同的行为:

foo = [a, b]
foo[foo.index(a)], foo[foo.index(b)] = x, y

其中
x==b
(在本例中,右边第一个值为
2
)的任何赋值。

您问了一个奇怪的问题。为什么
a[a.index(1)],a[a.index(2)]=2,1
我的意思是当要求a的值时。我在滥用符号。XDRelated(和devious):您能从文档中引用Python中的赋值顺序吗?向上投票并接受。谢谢你的出色工作!为什么
a=1;a、 b=2,a
导致
b==1
那么?您可能想在回答中讨论可变对象和不可变对象之间的区别。@pzp这不是可变对象和不可变对象,因为在任何赋值开始之前,右侧都已完全求值。对于可变的
a
,也会发生同样的情况。