变量交换在内部是如何工作的?

26

简单而短的问题。在Python中交换两个变量非常容易:a, b = b, a。这很好,我没有异议 :) 但我想知道它是如何在内部工作的?它是否会自己创建一些临时变量,还是有更有趣的东西发生了(我打赌是这样的)?

简而言之,Python使用元组解包的方式实现变量交换,它不会创建任何额外的临时变量。
1个回答

42

Python源代码在执行之前会被转换为字节码。您可以使用反汇编器dis查看字节码的样子,以了解其内部交换的情况:

import dis
>>> def f(a,b): a, b = b, a
>>> dis.dis(f)
  1           0 LOAD_FAST                1 (b)
              3 LOAD_FAST                0 (a)
              6 ROT_TWO             
              7 STORE_FAST               0 (a)
             10 STORE_FAST               1 (b)
             13 LOAD_CONST               0 (None)
             16 RETURN_VALUE 

简单来说,它将a和b的值推到堆栈上,交换堆栈顶部的两个元素,然后再弹出这些值。

另请参见:


太好了。我曾经错误地认为,在两个或多个表达式之间使用,时,Python会将它们打包成一个(这里是临时的)“元组”。也许这里不是这种情况,因为左边恰好有这两个ab。这就是指令中没有BUILD_TUPLE的原因吗? - S.B
1
@S.B 是的,这是一个特殊情况,由Python进行了优化。一般来说,逗号会创建一个元组。 - jthulhu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接