为何两段Python生成器实现的斐波那契代码输出截然不同?
为什么两段生成器实现的斐波那契代码输出截然不同?
这两段是完全不同的代码,核心差异在于变量更新的逻辑,直接导致了输出序列的天差地别:
代码1的问题:分步赋值导致递推逻辑错误
代码1中更新a和b的语句是分步执行的:
a = b b = a + b
每次执行时,a会先被替换成b的当前值,之后计算b时,使用的是更新后的a,而非最初的a值。举个具体的循环过程:
- 初始:
a=0,b=1,第一次yield 0 - 赋值后:
a=1,b=1+1=2 - 第二次
yield 1,赋值后:a=2,b=2+2=4 - 以此类推,每次
b都会变成自身的2倍,最终输出的是2^0, 2^1, 2^2...的等比序列。
代码2的正确逻辑:并行赋值实现斐波那契递推
代码2使用了Python的并行赋值(元组解包):
a, b = b, a + b
这种赋值方式会先计算右侧所有表达式的值(使用a和b的旧值),再一次性把结果赋值给左侧变量。循环过程:
- 初始:
a=0,b=1,第一次yield 0 - 右侧先计算:
b=1,a+b=0+1=1,再赋值给a和b,得到a=1,b=1 - 第二次
yield 1,右侧计算:b=1,a+b=1+1=2,赋值后a=1,b=2 - 第三次
yield 1,以此类推,完全符合斐波那契数列“每个数等于前两个数之和”的定义。
简单来说,代码1的递推逻辑是b = 2*b,代码2的递推逻辑是b = 旧a + 旧b,这就是输出差异的根本原因。
内容的提问来源于stack exchange,提问作者CKJ_1630
相关产品推荐
相关产品推荐

