为什么这两个python函数会返回不同的结果?

时间:2016-04-20 13:30:36

标签: python python-2.7 python-3.x

1 -

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

2 -

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

执行时:

fib1(10)我得错了答案:0 1 2 4 8

fib2(10)我得到了正确答案:0 1 1 2 3 5 8

3 个答案:

答案 0 :(得分:8)

在fib 1中 a = b 覆盖a

的值

表示a不再是语句的正确值

b = a+b

但是,在您的第二个示例中,这些内容同时发生在a,b = a, b+a行上,这意味着a仍然是正确的值。

答案 1 :(得分:0)

这是一个快速回答:

基本区别在于重新分配ab的值的方式。 在fib1()中,您有

a = b
b = a + b

fib2()中,您有

a, b = b, b + a

现在,这两个看起来是平等的,但事实并非如此。 这就是原因:

fib2()中,您将元组(b, b + a)的值分配给元组(a, b)。因此,重新分配值是同时的。

但是,对于fib1(),您首先使用ba的值分配给a = b,然后将值a + b分配给b 。由于您已经更改了a的值,因此您实际上正在执行

b = a + b = b + b = 2b

换句话说,你正在做a, b = b, 2b,这就是为什么你得到2的倍数而不是斐波纳契数列。

答案 2 :(得分:0)

fib1包含经典错误。它与交换两个变量的值处于相同的范围。想想你将如何用C或C ++完成它。

int a = 3;
int b = 5;
int temp;
temp = a; /* 3 */
a = b; /* 5 */
b = temp; /* 3, hence swapped */

虽然涉及中间计算,但有一种方法可以不使用temp。现在在Python中,如果您要利用tuple解压缩功能,则必须使用temp变量。

a = 3
b = 5
temp = a
a = b
b = temp

OR

a = 3
b = 5
a_ = (a+b)/2 - (a-b)/2 # 5.0
b_ = (a+b)/2 + (a-b)/2 # 3.0

最好像fib2一样使用元组解包。