gpt4 book ai didi

python交换和赋值

转载 作者:太空狗 更新时间:2023-10-30 02:30:52 25 4
gpt4 key购买 nike

通常,我们使用A[i], A[j] = A[j], A[i] 来交换。

有时这可能不起作用。例如,

A=[1, 2]
A[0], A[A[0]] = A[A[0]], A[0]

会失败。为什么会失败?如何解释分配?

最佳答案

让我们看一下相关语句的字节码:

>>> def f(A):
... A[0], A[A[0]] = A[A[0]], A[0]
...
>>> dis.dis(f)
2 0 LOAD_FAST 0 (A)
3 LOAD_FAST 0 (A)
6 LOAD_CONST 1 (0)
9 BINARY_SUBSCR
10 BINARY_SUBSCR
11 LOAD_FAST 0 (A)
14 LOAD_CONST 1 (0)
17 BINARY_SUBSCR
18 ROT_TWO
19 LOAD_FAST 0 (A)
22 LOAD_CONST 1 (0)
25 STORE_SUBSCR
26 LOAD_FAST 0 (A)
29 LOAD_FAST 0 (A)
32 LOAD_CONST 1 (0)
35 BINARY_SUBSCR
36 STORE_SUBSCR
37 LOAD_CONST 0 (None)
40 RETURN_VALUE

它是这样工作的:

  • 指令 0-10 将 A[A[0]] 压入值堆栈,因此它是 2
  • 指令 11-17 将 A[0] 压入值堆栈,现在是 2, 1
  • 指令 18 交换它们,堆栈为 1, 2
  • 指令 19-25 将最高值 (2) 赋给 A[0],将值堆栈保留为 1
  • 指令 26-36 尝试给 A[A[0]] 赋值,但是 A[0] 现在是 2,所以它试图赋值给 A[2],这是一个 IndexError。

简而言之,问题在于左侧的 A[A[0]] 直到分配给 A[0] 之后才会被求值.

作为修复,我建议:

A0 = A[0]
A[0], A[A0] = A[A0], A[0]

关于python交换和赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24600958/

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