如何在python列表中交换数字


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个索引,这就是您看到的结果。

请参阅文档中的此处,文档中说右侧表达式在左侧表达式之前求值。

最新更新