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的程序,与当今大多数物理处理器不同,后者是注册机。