Python 3.8.2 (tags/v3.8.2:7b3ab59, Feb 25 2020, 23:03:10) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> a = [1,2,0]
>>> a[0], a[a[0]] = a[a[0]], a[0]
>>> a
[2, 2, 1]
首先,为什么结果不是[2, 1, 0]
?
第二,在这种情况下交换号码的最佳做法是什么?
在您的行中:
a[0], a[a[0]] = a[a[0]], a[0]
表达式:
a[a[0]], a[0]
将首先进行评估,然后将结果解压缩并分配给a[0], a[a[0]]
,首先a[0]
将等于2
,这意味着a[a[0]]
将与a[2]
相同,等效于:
a[0], a[2] = a[a[0]], a[0]
您可以使用进行交换
a[0], a[1] = a[1], a[0]
在内部,Python首先为a[0]
分配一个新值。然后这个值被用在第二个变量的索引中,所以你最终把一个数字放在了你不想要的地方。写出来,它更像这样:
x = a[a[0]] # 2
y = a[0]
a[0] = x
a[a[0]] = y # a[2] = 1 -- Wrong index!
要修复它,请使用一个临时变量:
temp = a[a[0]]
a[0], a[temp] = a[temp], a[0]
首先计算右侧表达式,其中a[a[0]], a[0]
的值为2和1。
现在,它们被分配给在右侧表达式之后评估的左侧表达式,并且由于a[0]
被分配给了a[a[0]]
,即2,因此第二次分配给a[a[0]]
将意味着分配给a[2]
。
因此,出现了两个赋值,一个在第0个索引,另一个在2个索引,这就是您看到的结果。
请参阅文档中的此处,文档中说右侧表达式在左侧表达式之前求值。