2012-11-12 23 views
1

我是一名Python初学者。我正在看一个类型,使斐波那契函数,Python - 斐波那契函数变量值声明之间的区别

def fib(n): 
a=0 
b=1 
while a<n: 
    print a 
    a,b=b,a+b 

我看到a,b = b,a + b声明。所以,我认为A = B和B = A + B是相同的,B = A,B + A,所以我改变了功能,它是这样的:

def fib(n): 
a=0 
b=1 
while a<n: 
    print a 
    a=b 
    b=a+b 

,我认为这会是对的,但是当我执行程序时,我得到了不同的输出。有人能向我解释这两种声明之间的区别吗?

谢谢,无论如何。

+0

请参阅[在python中保证变量是原子吗?](http://stackoverflow.com/q/2623086) –

回答

0

b, a+b创建一个包含这两个值的元组。然后a, b = ...解开元组并将其值赋给变量。但是,在您的代码中,您将覆盖第一个值,因此第二行使用新值。

a, b = b, a + b 

大致等于:

tmp = a 
a = b 
b = tmp + b 
0

即语法基于所述电流值同时分配新值,以ab。不等价的原因是,当您编写两条单独的语句时,第二个分配使用新的的值a而不是旧的的值为a

1

当Python执行

a,b = b, a+b 

evaluates the right-hand side first,然后解包元组和值分配给ab。请注意,右侧的a+b正在使用a旧的值。

当Python执行

a=b 
b=a+b 

它计算b并分配它的值a。 然后它评估a+b并将该值分配给b。现在注意a+b正在使用新的值为a

0

在第一个例子中,不更新,直到整个行被评价采取b的值 - 所以B实际上是A + B。

在你的例子中,你已经设置为b,所以最后一行(b = a + b)可以很容易地是b = b + b。

这一切都按评估事物的顺序进行。