Python交换变量相当于C++;11交换?[a,b=b,a]

Python交换变量相当于C++;11交换?[a,b=b,a],python,swap,Python,Swap,交换变量的一种非常简洁的方法是: a,b = b,a 我很好奇,所以我用dis模块对它进行了调试,看到了“ROT_TWO”指令。ROT_TWO是否表示没有复制数据,但只交换指针?基本上与std::move相同?根据“dis”文件: ROT_TWO:交换最上面的两个堆栈项 a、b在什么上下文中位于同一堆栈上 代码: import dis def swap(): a = 1 b = 2 a, b = b, a dis.dis(swap) 3 0 LO

交换变量的一种非常简洁的方法是:

a,b = b,a
我很好奇,所以我用dis模块对它进行了调试,看到了“ROT_TWO”指令。ROT_TWO是否表示没有复制数据,但只交换指针?基本上与std::move相同?根据“dis”文件:

ROT_TWO:交换最上面的两个堆栈项

a、b在什么上下文中位于同一堆栈上

代码:

import dis
def swap():
    a = 1
    b = 2
    a, b = b, a

dis.dis(swap)
3           0 LOAD_CONST               1 (1)
              3 STORE_FAST               0 (a)

  4           6 LOAD_CONST               2 (2)
              9 STORE_FAST               1 (b)

  5          12 LOAD_FAST                1 (b)
             15 LOAD_FAST                0 (a)
             18 ROT_TWO             
             19 STORE_FAST               0 (a)
             22 STORE_FAST               1 (b)
             25 LOAD_CONST               0 (None)
             28 RETURN_VALUE        
输出:

import dis
def swap():
    a = 1
    b = 2
    a, b = b, a

dis.dis(swap)
3           0 LOAD_CONST               1 (1)
              3 STORE_FAST               0 (a)

  4           6 LOAD_CONST               2 (2)
              9 STORE_FAST               1 (b)

  5          12 LOAD_FAST                1 (b)
             15 LOAD_FAST                0 (a)
             18 ROT_TWO             
             19 STORE_FAST               0 (a)
             22 STORE_FAST               1 (b)
             25 LOAD_CONST               0 (None)
             28 RETURN_VALUE        

如果您考虑的是
std::move
,或者您认为
ROT_TWO
字节码的细节对是否发生数据复制很重要,那么您就误解了Python变量的工作方式。它们不像C++变量;在C++术语中,它们有点像可绑定的引用。请参阅。它们是局部变量,通常在调用堆栈上推送局部变量。虽然每个解释器都可以自由地处理内存,也可以看到,这是专门为C++视角的人编写的,这些都是有用的提示。感谢Willem指出局部变量被推到了同一个位置callstack@WillemVanOnsem:有点,但操作码和大多数其他CPython字节码指令中涉及的堆栈实际上与调用堆栈完全不同。CPython解释器是一个类似于JVM的程序,与当今大多数物理处理器不同,后者是注册机。