Python声明了多个变量的混淆



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

a = 0
b = 1
solution = 0
while b <= 4000000:
if b % 2 == 0:
solution += b
a, b = b, a + b
print(solution)

在这种情况下,solution4613732。但是,当我尝试此代码时:

a = 0
b = 1
solution = 0
while b <= 4000000:
if b % 2 == 0:
solution += b
a = b
b = a + b
print(solution)

solution是4194302

有什么建议吗?

差异解释

因为你写:

a = b
b = a + b

在你的第二种方法中。这意味着在第一行之后,a的值为b。第二条生产线将产生b = a + b = b + b所以两倍b.换句话说,第二个实际上将经历两个的幂。

这在第一种方法中不会发生,因为您写道:

a, b = b, a + b

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

更有效的方法

你想总结偶数斐波那契。但是,您可以更有效地做到这一点。如果你对斐波那契数列进行分析,你会发现它是结构化的:

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%

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

仅仅是因为,赋值运算符右侧的所有表达式都会首先被计算。

因此,假设您有以下代码:

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

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

实际上,在=运算符的右侧,b的计算结果为 7,a+b的计算结果为 12

a, b = 7, 12 

最新更新