可能重复:
Python 中的多重赋值
正如我们从 C 开始学习到的那样,在计算机上同时在一个线程中工作时,所有操作都会一个接一个地发生。
我对 Python 3 语言有疑问。我已经看到使用表达式交换变量值的代码:
a,b = b,a
或者对于斐波那契数列使用:
a,b = b,a+b
这些如何工作?但他们确实有效:O
Python 系统是否在内部为这些创建了一些临时变量?分配的顺序是什么,以便两者都能有效地给出正确的结果?
问候, 尼基尔
可能重复:
Python 中的多重赋值
正如我们从 C 开始学习到的那样,在计算机上同时在一个线程中工作时,所有操作都会一个接一个地发生。
我对 Python 3 语言有疑问。我已经看到使用表达式交换变量值的代码:
a,b = b,a
或者对于斐波那契数列使用:
a,b = b,a+b
这些如何工作?但他们确实有效:O
Python 系统是否在内部为这些创建了一些临时变量?分配的顺序是什么,以便两者都能有效地给出正确的结果?
问候, 尼基尔
在较高级别上,您正在创建两个元组,左侧和右侧,并将右侧分配给左侧,这将变量一一更改为它们的对立面。Python 是一种高级语言,因此与 C 等语言相比,有更多这样的抽象。
在低级别,您可以通过使用该模块非常清楚地看到正在发生的事情dis
,它可以向您显示函数的 python 字节码:
>>> import dis
>>> def test(x, y):
... x, y = y, x
...
>>> dis.dis(test)
2 0 LOAD_FAST 1 (y)
3 LOAD_FAST 0 (x)
6 ROT_TWO
7 STORE_FAST 0 (x)
10 STORE_FAST 1 (y)
13 LOAD_CONST 0 (None)
16 RETURN_VALUE
发生的情况是它用于ROT_TWO
交换堆栈中项目的顺序,这是一种非常有效的方法。
当你写作时a, b
,你创造tuple
。
>>> 1, 2
(1, 2)
因此,评估顺序没有什么特别之处。
From the Fibonacci example with a=1
and b=1
. First, the right hand side is evaluated: b,a+b
resulting in the tuple (1,2)
. Next, the right hand side is assigned to the left hand side, namely a
and b
. So yes, the evaluation on the right is stored in memory, and then a
and b
changed to point to these new values.