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]