gpt4 book ai didi

python - Python 的交换符号中的顺序重要吗? (a, b = b, a)

转载 作者:行者123 更新时间:2023-12-04 23:35:31 25 4
gpt4 key购买 nike

我一直在解决一个编码面试问题,它看起来像:

给定一个字符数组 A 和一个整数数组 P,其中 P[i] 表示排列中 i 处元素的位置。例如,当 A = <a, b, c, d>P = <2, 0, 1, 3> , A 应该变成 <b, c, a, d>
我对此的解决方案如下:

for i in range(len(A)):
while perm[i] != i:
A[i], A[perm[i]] = A[perm[i]], A[i]
perm[i], perm[perm[i]] = perm[perm[i]], perm[i]

这个给了我一个无限循环,而下面的一个工作
for i in range(len(A)):
while perm[i] != i:
A[perm[i]], A[i] = A[i], A[perm[i]]
perm[perm[i]], perm[i] = perm[i], perm[perm[i]]

我一直认为 Python 中交换快捷方式的顺序无关紧要,但我很困惑为什么上面的一个不起作用而下面的一个工作正常。

有什么想法吗?

最佳答案

顺序有点重要,你在它最终重要的地方创建了代码。在任何分配发生之前,整个右侧都已完全计算,因此在简单场景中,这无关紧要。但比较:

perm[i], perm[perm[i]] = perm[perm[i]], perm[i]

到:
perm[perm[i]], perm[i] = perm[i], perm[perm[i]]

分配给 perm[i]在第一个影响从 perm[i] 读取的值分配给 perm[perm[i]] 时;在第二个中,分配给 perm[perm[i]]使用旧值 perm[i]确定分配位置,然后分配新值 perm[i] .

发生这种情况是因为分配是从左到右执行的;采取的步骤依次是:
  • tuple右侧的所有值都被构造(在当前解释器中没有构造实际的 tuple,但这是逻辑上发生的)
  • 分配给左目标(包括找出分配位置所需的所有读取)
  • 分配继续到正确的目标

  • 基本上,您遇到了问题,因为您在赋值的左侧以不同的顺序读取和写入相同的值。

    关于python - Python 的交换符号中的顺序重要吗? (a, b = b, a),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59081600/

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