gpt4 book ai didi

python - 为什么我的交换列表的两个元素的代码出错了?

转载 作者:太空宇宙 更新时间:2023-11-03 11:14:10 25 4
gpt4 key购买 nike

这是我的代码:

a = [1, 2, 3, 4, 5]
a[0], a[a[0]] = a[a[0]], a[0]
print(a)

我正在尝试将 a[0]a[a[0]] 交换(即 a[1] 在这个案例),所以我期望的结果是:

[2, 1, 3, 4, 5]

我得到的结果是[2, 2, 1, 4, 5],这不是我想要的。

如果我将 a[0], a[a[0]] = a[a[0]], a[0] 简化为 a[0], a[1 ] = a[1], a[0],有效。

我怎样才能像 a, b = b, a 那样在列表中进行交换?

最佳答案

这项作业做得很多。让我们分解一切……

a = [1, 2, 3, 4, 5]

好的,这很简单。下一页:

a[0], a[a[0]] = a[a[0]], a[0]

任何赋值中发生的第一件事就是计算右侧,因此:

a[a[0]], a[0] 简化为 a[1], a[0],计算结果为 (2, 1)

然后,每个分配目标依次从右侧分配给它的那些项目之一:

a[0] = 2   # 2 == first item in the (already evaluated) right hand side

现在完成了,a 看起来像这样:

[2, 2, 3, 4, 5]

现在我们来做第二个作业:

a[a[0]] = 1   # 1 == second item in the (already evaluated) right hand side

但是等等! a[0] 现在是 2,所以这减少到

a[2] = 1

而且,你瞧,如果我们再次查看 a,它的结果是:

[2, 2, 1, 4, 5]

您发现的是,尽管 Python 声称能够同时交换两个值,例如a, b = b, a,这不是真的。它在实践中几乎总是有效,但如果其中一个值是另一个值的描述的一部分——在这种情况下,a[0]a[a 的描述的一部分[0]] – 实现细节可能会让您感到困惑。

解决这个问题的方法是在开始重新分配之前存储 a[0] 的初始值:

a = [1, 2, 3, 4, 5]
tmp = a[0]
a[0], a[tmp] = a[tmp], a[0]

之后,a 看起来就像您期望的那样:

[2, 1, 3, 4, 5]

关于python - 为什么我的交换列表的两个元素的代码出错了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54938579/

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