在列表中交换两个元素会显示意外行为

Sou*_*Ray 8 python arrays list python-3.x

我有一个清单:

lis = [12,45,15,67,89]
Run Code Online (Sandbox Code Playgroud)

我想交换12和89这样的列表应该看起来

lis = [89,45,15,67,12]
Run Code Online (Sandbox Code Playgroud)

当我这样做的时候

lis[0], lis[lis.index(89)] = lis[lis.index(89)], lis[0]
Run Code Online (Sandbox Code Playgroud)

什么都没有改变

lis = [12,45,15,67,89]
Run Code Online (Sandbox Code Playgroud)

但是当我这样做的时候

lis5[0], lis5[4] = lis5[4], lis5[0]
Run Code Online (Sandbox Code Playgroud)

它完美无缺

lis = [89,45,15,67,12]
Run Code Online (Sandbox Code Playgroud)

那么为什么它不是第一种方式呢?PS-我想要做第一种方式的全部原因是因为我想在列表中找到max元素然后将其与列表的第一个元素交换.

就像是:

max1 = max(lis)
lis[0], lis[lis.index(max1)] = lis[lis.index(max1)], lis[0]
Run Code Online (Sandbox Code Playgroud)

fal*_*tru 7

简而言之,lis.index(max1)在不同的时间评估左/右侧; 然后评估为不同的值(0左侧,4右侧).


a, b = b, a
Run Code Online (Sandbox Code Playgroud)

以上声明:

  • 创造(b, a)元组
  • 将上面的元组解压缩到ab
    • a =旧值-b
    • b = a-old-of-a

lis[0], lis[lis.index(89)] = lis[lis.index(89)], lis[0]
Run Code Online (Sandbox Code Playgroud)

lis[0], lis[lis.index(89)] = lis[4], lis[0]
Run Code Online (Sandbox Code Playgroud)

=>

lis[0], lis[lis.index(89)] = 89, 0
Run Code Online (Sandbox Code Playgroud)

=>

lis[0] = 89
lis[lis.index(89)] = 0
Run Code Online (Sandbox Code Playgroud)

=>

lis[0] = 89
lis[0] = 0    # NOTE lis.index(89) == 0  at this point
Run Code Online (Sandbox Code Playgroud)

所以lis[0]分配89,然后分配原始值0.=>(仅更改了第一个元素,并重新分配了原始值)


要避免此问题,请在swap语句之前分配索引:

idx = lis.index(89)
lis[0], lis[idx] = lis[idx], lis[0]
Run Code Online (Sandbox Code Playgroud)