Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python声明多变量混淆_Python_Variables_Fibonacci - Fatal编程技术网

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
VS
a=b
b=a+b
记住,RHS总是首先得到评估,你会发现这并不奇怪。使用print语句调试和理解代码第一个是同时赋值,第二个是程序性的,其中b获取更新的值。@yosemite_k:请注意,赋值不是同时进行的,因为这些赋值是同时进行的,甚至没有一个赋值可以相互影响。赋值是从左到右进行的。
a,b=b,a+b
VS
a=b
b=a+b
记住,RHS总是先求值,你会发现这并不奇怪。使用打印语句调试和理解代码第一个是同时赋值,第二个是程序性的,其中b获取更新的值。@yosemite_k:请注意,赋值不是同时进行的,因为这些赋值是同时进行的,甚至没有一个赋值可以相互影响。作业是从左到右完成的。