zyc*_*hyz 5 python swap python-3.x iterable-unpacking
这是我的代码:
a = [1, 2, 3, 4, 5]
a[0], a[a[0]] = a[a[0]], a[0]
print(a)
Run Code Online (Sandbox Code Playgroud)
我正在尝试交换a[0](a[a[0]]即a[1]在本例中),所以我期望的结果是:
[2, 1, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)
我得到的结果是[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以前那样工作?
这项任务的作用相当大。让我们分解一切 \xe2\x80\xa6
\n\na = [1, 2, 3, 4, 5]\nRun Code Online (Sandbox Code Playgroud)\n\n好吧,这就是最简单的一点。下一个:
\n\na[0], a[a[0]] = a[a[0]], a[0]\nRun Code Online (Sandbox Code Playgroud)\n\n任何赋值中发生的第一件事是评估右侧,因此:
\n\na[a[0]], a[0]减少到a[1], a[0],其计算结果为(2, 1)。
然后,每个分配目标依次从分配给它的右侧获取这些项目之一:
\n\na[0] = 2 # 2 == first item in the (already evaluated) right hand side\nRun Code Online (Sandbox Code Playgroud)\n\n现在已经完成了,a看起来像这样:
[2, 2, 3, 4, 5]\nRun Code Online (Sandbox Code Playgroud)\n\n现在我们要做第二个作业:
\n\na[a[0]] = 1 # 1 == second item in the (already evaluated) right hand side\nRun Code Online (Sandbox Code Playgroud)\n\n可是等等!a[0]就是现在2,所以这减少到
a[2] = 1\nRun Code Online (Sandbox Code Playgroud)\n\n而且,你瞧,如果我们看一下a,结果是:
[2, 2, 1, 4, 5]\nRun Code Online (Sandbox Code Playgroud)\n\n您发现,尽管 Python 声称能够使用 eg 同时交换两个值a, b = b, a,但事实并非如此。它在实践中几乎总是有效,但如果其中一个值是另一个值的描述的一部分 \xe2\x80\x93 在这种情况下,a[0]是 \xe2\x80\x93 的描述的一部分,a[a[0]]那么实现细节可能会绊倒你向上。
解决此问题的方法是a[0]在开始重新分配事物之前存储 的初始值:
a = [1, 2, 3, 4, 5]\ntmp = a[0]\na[0], a[tmp] = a[tmp], a[0]\nRun Code Online (Sandbox Code Playgroud)\n\n之后,a看起来就像你期望的那样:
[2, 1, 3, 4, 5]\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
114 次 |
| 最近记录: |