python - 为什么Python要交换堆栈顶部的两个元素来交换两个变量?

标签 python

以下 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交换堆栈前两个元素的顺序。

我很难理解为什么这是必要的。

我的理解是,为了交换 ab,您可以先推送 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.

你可以,但是那会首先读取aa, b = b, a 表示先读取 b

这通常并不重要,但如果您在一个非常奇怪的命名空间中执行此代码,那么它可能会影响线程安全和调试。

关于python - 为什么Python要交换堆栈顶部的两个元素来交换两个变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74214687/

相关文章:

python - 无法在 Python 中导入 GST

Python 等效于 MATLAB 命令 prod

Python:直接从 Pandas 加载 Oracle 表(写入 Oracle)

python - 使用python脚本telnet登录

python - Raspberry Pi 不会在启动时运行脚本

python - 类型错误 : 'unicode' object is not callable

python - 使用 python 关闭 PDF

python - 通过网络共享间歇性 'OSError: [Errno 2] No such file or directory'

python - 如何在 python 中的同一个图形上绘制多个密度图

python - 为什么使用 classmethod 而不是 staticmethod?