Python声明多变量混淆

时间:2017-06-15 14:31:05

标签: python variables fibonacci

我想知道为什么这段代码给了我两个不同的解决方案:

a = 0
b = 1
solution = 0

while b <= 4000000:
    if b % 2 == 0:
        solution += b
    a, b = b, a + b

print(solution)

在这种情况下solution是4613732.但是当我尝试这段代码时:

a = 0
b = 1
solution = 0

while b <= 4000000:
    if b % 2 == 0:
        solution += b
    a = b
    b = a + b

print(solution)

solution是4194302

有什么建议吗?

2 个答案:

答案 0 :(得分:4)

解释差异

因为你写道:

a = b
b = a + b

在你的第二种方法中。这意味着在第一行之后a的值为b 。第二行将生成b = a + b = b + b两次b。换句话说,第二个实际上将走过两个人的力量。

在第一种方法中没有发生这种情况,因为你写道:

a, b = b, a + b

因此,您首先构建一个元组(b,a+b) ab 值。 接下来解压缩 ,再次将该元组转换为ab。但是您首先使用旧值评估a + b。这是本质区别。

更有效的方法

您想要总结甚至斐波那契数字。但是,你可以更有效地使用它。如果您对Fibonacci序列进行分析,您会发现它的结构是:

o o e o o e o o e ...

o奇数号码,e偶数号码。因此,您只需使用三个的跃点,例如:

a = 1
b = 2
solution = 0

while b <= 4000000:
    solution += b
    a,b = a+2*b,2*a+3*b

print(solution)

这里我们节省了迭代并检查b是否甚至:我们只知道它始终是偶数。

使用timeit(在Linux上使用Python 3.5.3和GCC 6.3.0)时,我们获得以下结果:

original   3.4839362499988056
optimized  1.5940769709995948  45.755%

因此,优化程序的平均运行时间约为原始程序的一半。

答案 1 :(得分:1)

仅仅因为,首先评估赋值运算符右侧的所有表达式。

所以,假设你有以下代码:

a = 5
b = 7
a, b = b, a + b 

您希望为a分配值7,然后使用新值为b分配值{ab的总和a

事实上,在=运算符的右侧,b被评估为7,a+b被评估为12

a, b = 7, 12