Python2.7交换的奇怪行为

Python2.7交换的奇怪行为,python,python-2.7,list,Python,Python 2.7,List,我想将第一个元素(4)与第三个元素(1)交换为列表[-1,4,3,1],我希望输出是[-1,1,3,4],但为什么输出是[4,1,3,1] 使用Python2.7 a=[-1,4,3,1] i=1 a[i],a[a[i]-1]=a[a[i]-1],a[i] print a # output [4, 1, 3, 1] # expect [-1, 1, 3, 4] 这些值按从左到右的顺序分配给左侧的目标。因此,在第一个值被分配给a[i]之后,a[i]的值被改变,并且这个新值用于计算分配给a[a[i

我想将第一个元素(
4
)与第三个元素(
1
)交换为列表
[-1,4,3,1]
,我希望输出是
[-1,1,3,4]
,但为什么输出是
[4,1,3,1]

使用Python2.7

a=[-1,4,3,1]
i=1
a[i],a[a[i]-1]=a[a[i]-1],a[i]
print a # output [4, 1, 3, 1]
# expect [-1, 1, 3, 4]

这些值按从左到右的顺序分配给左侧的目标。因此,在第一个值被分配给
a[i]
之后,
a[i]
的值被改变,并且这个新值用于计算分配给
a[a[i]-1]

在赋值语句中,始终计算右侧 在执行实际的变量赋值之前,请先完成

从左到右的实际变量赋值

a[i], a[a[i]-1] = 1, 4
# is same as
a[i] = 1
a[1-1] = 4 
这就是得到[4,1,3,1]结果的原因。 有了布伦巴恩的解释,你可以做这样的事情

a[a[i]-1], a[i] = a[i], a[a[i]-1] # return [-1, 1, 3, 4]

谢谢布伦巴恩,接得好!但是Python交换行为赋值不是并行的吗?@LinMa:这取决于你所说的“并行”是什么意思。右边的所有值都是在完成任何赋值之前计算出来的,因此像
a,b=b,a
这样的简单交换将起作用。只要左侧的目标不相互参照,分配可能看起来是“平行”的。但是,如果左侧的任何目标依赖于左侧的其他目标,则它们可以相互影响。
a[a[i]-1], a[i] = a[i], a[a[i]-1] # return [-1, 1, 3, 4]