gpt4 book ai didi

python - 交换列表中的两个元素显示意外行为

转载 作者:太空狗 更新时间:2023-10-29 21:00:23 25 4
gpt4 key购买 nike

我有一个列表:

lis = [12,45,15,67,89]

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

lis = [89,45,15,67,12]

当我这样做的时候

lis[0], lis[lis.index(89)] = lis[lis.index(89)], lis[0]

什么都没有改变

lis = [12,45,15,67,89]

但是当我这样做的时候

lis5[0], lis5[4] = lis5[4], lis5[0]

效果很好

lis = [89,45,15,67,12]

那么为什么第一种方式不起作用呢? PS-我想用第一种方法的全部原因是因为我想在列表中找到最大元素,然后将它与列表的第一个元素交换。

类似于:

max1 = max(lis)
lis[0], lis[lis.index(max1)] = lis[lis.index(max1)], lis[0]

最佳答案

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


a, b = b, a

以上声明:

  • 创建(b, a)元组
  • 将上述元组解压为ab
    • a = b 的旧值
    • b = a 的旧值

lis[0], lis[lis.index(89)] = lis[lis.index(89)], lis[0]

成为

lis[0], lis[lis.index(89)] = lis[4], lis[0]

=>

lis[0], lis[lis.index(89)] = 89, 0

=>

lis[0] = 89
lis[lis.index(89)] = 0

=>

lis[0] = 89
lis[0] = 0 # NOTE lis.index(89) == 0 at this point

所以 lis[0] 分配了 89,然后又分配回原来的值 0。 =>(只改变了第一个元素,并重新分配了原来的值)


为避免此问题,请在交换语句之前分配索引:

idx = lis.index(89)
lis[0], lis[idx] = lis[idx], lis[0]

关于python - 交换列表中的两个元素显示意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44867281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com