以下 Python 代码:
a = 1
b = 2
a, b = b, a
编译为以下 Python 字节码:
1 0 LOAD_CONST 0 (1)
2 STORE_NAME 0 (a)
2 4 LOAD_CONST 1 (2)
6 STORE_NAME 1 (b)
3 8 LOAD_NAME 1 (b)
10 LOAD_NAME 0 (a)
12 ROT_TWO
14 STORE_NAME 0 (a)
16 STORE_NAME 1 (b)
18 LOAD_CONST 2 (None)
20 RETURN_VALUE
根据Python's docs ,指令ROT_TWO
交换堆栈前两个元素的顺序。
我很难理解为什么这是必要的。
我的理解是,为了交换 a
和 b
,您可以先推送 a
,然后推送 b
,然后将stacktop存储在a
中,然后将stacktop存储在b
中,实现变量交换。像这样的事情:
1 0 LOAD_CONST 0 (1)
2 STORE_NAME 0 (a)
2 4 LOAD_CONST 1 (2)
6 STORE_NAME 1 (b)
3 8 LOAD_NAME 1 (b)
10 LOAD_NAME 0 (a)
14 STORE_NAME 1 (b)
16 STORE_NAME 0 (a)
18 LOAD_CONST 2 (None)
20 RETURN_VALUE
为什么需要这个额外的操作?与我建议的解决方案相比,这样做有什么优势吗?
最佳答案
My understanding is that, in order to swap a and b, you could just push a, then push b, then store the stacktop in a, then store the stacktop in b, achieving the variable swap.
你可以,但是那会首先读取a
。 a, b = b, a
表示先读取 b
。
这通常并不重要,但如果您在一个非常奇怪的命名空间中执行此代码,那么它可能会影响线程安全和调试。
关于python - 为什么Python要交换堆栈顶部的两个元素来交换两个变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74214687/