Python中的评估顺序尚不清楚

时间:2012-12-18 11:17:11

标签: python python-3.x variable-assignment operator-precedence

  

可能重复:
  Multiple assignment in Python

正如我们从一开始就在计算机上开始使用C开始学习的那样,所有操作都是逐个进行的。

我对Python 3语言有疑问。我见过使用表达式交换变量值的代码:

a,b = b,a

或者使用Fibonacci系列:

a,b = b,a+b

这些如何运作?但他们确实有效:O

Python系统内部是否为这些创建了一些临时变量?分配的顺序是什么,以便有效地给出正确的结果?

此致 NIKHIL

3 个答案:

答案 0 :(得分:4)

在较高的层次上,您创建了两个元组,左侧和右侧,并将右侧的元素分配给左侧,这将变量逐个更改为它们的对立面。 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来交换堆栈中项目的顺序,这是一种非常有效的方法。

答案 1 :(得分:0)

当您撰写a, b时,您需要创建tuple

>>> 1, 2
(1, 2)

因此,评估顺序没有什么特别之处。

答案 2 :(得分:0)

来自斐波纳契示例a=1b=1。首先,评估右侧:b,a+b,得到元组(1,2)。接下来,右侧分配到左侧,即ab。所以是的,右边的评估存储在内存中,然后ab更改为指向这些新值。