两段Python斐波那契代码输出结果不同,求差异及原因解析
两段斐波那契代码的差异及结果不同的原因
原Python 3.7文档中的正确代码及运行结果:
>>> # Fibonacci series: ... # the sum of two elements defines the next ... a, b = 0, 1 >>> while a < 10: ... print(a) ... a, b = b, a+b ... 0 1 1 2 3 5 8
改写后的代码及运行结果:
>>> a, b = 0, 1 >>> while a < 10: print(a) a = b b = a + b 0 1 2 4 8
核心差异与原因
两段代码的本质区别在于变量赋值的执行逻辑:
- 原代码使用
a, b = b, a+b这种元组解包式的同时赋值:Python会先计算等号右侧所有表达式的结果(此时用的是赋值前的a和b旧值),再一次性将结果分别赋给左侧的a和b。这完全符合斐波那契数列的定义——下一个数是前两个数的和。 - 改写后的代码是分步顺序赋值:先执行
a = b,把b的当前值赋给a,此时a已经被更新;接着执行b = a + b,这里的a已经是刚更新后的新值,所以实际计算的是b = 旧b + 旧b,也就是把b变成了原来的两倍,最终得到的是2的幂次序列,而非斐波那契数列。
举个循环步骤的具体对比:
- 第一次循环后:
- 原代码:
a=1,b=0+1=1 - 改写代码:
a=1,b=1+1=2
- 原代码:
- 第二次循环后:
- 原代码:
a=1,b=1+1=2 - 改写代码:
a=2,b=2+2=4
- 原代码:
这样一步步执行下来,最终结果自然完全不同。
内容的提问来源于stack exchange,提问作者Sikeh Japhet
相关产品推荐
相关产品推荐

