Python声明多变量混淆
我想知道为什么这段代码给了我两种不同的解决方案:Python声明多变量混淆,python,variables,fibonacci,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) 解决方案是4194302 有什么建议吗?解释了差异 因为你写: a = b b = a + b a, b = b, a + b 在第二种方法中。这意味着在第一行之后,a的值为b。第二行将产生
a = 0
b = 1
solution = 0
while b <= 4000000:
if b % 2 == 0:
solution += b
a, b = b, a + b
print(solution)
解决方案是4194302
有什么建议吗?解释了差异
因为你写:
a = b
b = a + b
a, b = b, a + b
在第二种方法中。这意味着在第一行之后,a
的值为b
。第二行将产生b=a+b=b+b
,因此两次b
。换句话说,第二个将实际通过两个的幂
这在第一种方法中没有发生,因为您写了:
a = b
b = a + b
a, b = b, a + b
因此,您首先构造一个元组(b,a+b)
(使用a
和b
旧值)接下来,再次将该元组解压为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)
因此,优化程序的平均运行时间约为原始程序的一半。差异已得到解释
因为你写:
a = b
b = a + b
a, b = b, a + b
在第二种方法中。这意味着在第一行之后,a
的值为b
。第二行将产生b=a+b=b+b
,因此两次b
。换句话说,第二个将实际通过两个的幂
这在第一种方法中没有发生,因为您写了:
a = b
b = a + b
a, b = b, a + b
因此,您首先构造一个元组(b,a+b)
(使用a
和b
旧值)接下来,再次将该元组解压为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)
因此,优化程序的平均运行时间约为原始程序的一半。原因很简单,赋值运算符右侧的所有表达式都首先求值
假设你有下面的代码:
a = 5
b = 7
a, b = b, a + b
您希望a
分配值7,然后b
分配值14,即a
和b
的总和,使用a
的新值
事实上,在=
操作符的右侧,b
被计算为7,a+b
被计算为12
a, b = 7, 12
原因很简单,赋值运算符右侧的所有表达式都首先求值
假设你有下面的代码:
a = 5
b = 7
a, b = b, a + b
您希望a
分配值7,然后b
分配值14,即a
和b
的总和,使用a
的新值
事实上,在=
操作符的右侧,b
被计算为7,a+b
被计算为12
a, b = 7, 12
a,b=b,a+b
VSa=b
和b=a+b
记住,RHS总是首先得到评估,你会发现这并不奇怪。使用print语句调试和理解代码第一个是同时赋值,第二个是程序性的,其中b获取更新的值。@yosemite_k:请注意,赋值不是同时进行的,因为这些赋值是同时进行的,甚至没有一个赋值可以相互影响。赋值是从左到右进行的。a,b=b,a+b
VSa=b
和b=a+b
记住,RHS总是先求值,你会发现这并不奇怪。使用打印语句调试和理解代码第一个是同时赋值,第二个是程序性的,其中b获取更新的值。@yosemite_k:请注意,赋值不是同时进行的,因为这些赋值是同时进行的,甚至没有一个赋值可以相互影响。作业是从左到右完成的。