2

我是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 和 a,b=a,b+a 是一样的,所以我把函数改成这样:

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

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

不管怎么说,还是要谢谢你。

4

4 回答 4

1

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

a, b = b, a + b

大致等于:

tmp = a
a = b
b = tmp + b
于 2012-11-12T21:36:31.183 回答
1

当 Python 执行时

a,b = b, a+b

它首先评估右侧,然后解包元组并将值分配给aand b。请注意,a+b右侧使用的是 的a

当 Python 执行时

a=b
b=a+b

它评估b并将其值分配给a。然后它评估a+b并将该值分配给b。现在请注意,它a+b正在使用 的a

于 2012-11-12T21:36:44.803 回答
0

在第一个示例中,直到对整行求值后,a 才会更新为获取 b 的值——因此 b 实际上是 a + b。

在您的示例中,您已经将 a 设置为 b,因此最后一行 (b=a+b) 可以很容易地设置为 b=b+b。

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

于 2012-11-12T21:37:30.413 回答
0

a该语法同时b基于当前值分配新值。它不等价的原因是,当您编写两个单独的语句时,第二个赋值使用值 ofa而不是值 of a

于 2012-11-12T21:36:39.660 回答