两段Python斐波那契数列代码的差异咨询:为何代码看似相同但输出不同?
为什么两段斐波那契数列Python代码输出不同?
嘿,这个问题我当初刚学Python的时候也踩过坑!咱们来一步步拆解这两段代码的差异,你很快就能明白为啥输出不一样了。
先看你给出的两段代码:
代码1
def fibonacci(num): a=1 b=1 series=[] series.append(a) series.append(b) for i in range(1,num-1): series.append(a+b) #a,b=b,a+b a=b b=a+b return series print(fibonacci(10))
代码2
def fibonacci(num): a=1 b=1 series=[] series.append(a) series.append(b) for i in range(1,num-1): series.append(a+b) a,b=b,a+b #a=b #b=a+b return series print(fibonacci(10))
核心差异:赋值方式的不同
两段代码的唯一区别在于循环里更新a和b的方式:
- 代码1是分步赋值:先把
a改成b的当前值,再用更新后的a去计算新的b - 代码2是同时赋值(元组解包):右边的
b和a+b都是用赋值前的旧值计算,然后同时更新a和b
咱们拿前几次循环的变量变化来直观对比:
初始状态
a=1,b=1,series=[1,1]
第一次循环(i=1)
- 两段代码都会先执行
series.append(a+b),把1+1=2加入列表,此时series=[1,1,2]
接下来的赋值步骤差异出现:
代码1:
a = b→a变成1(还是原来的b值)b = a + b→ 这里的a已经是新的1,b还是原来的1,所以b=1+1=2
此时状态:a=1,b=2
代码2:
a,b = b, a+b→ 右边的b是原来的1,a+b是原来的1+1=2,所以同时把a设为1,b设为2
此时状态:a=1,b=2(这一步和代码1结果一样)
第二次循环(i=2)
- 两段代码先执行
series.append(a+b):- 代码1:
a=1,b=2,所以append3,series=[1,1,2,3] - 代码2:
a=1,b=2,同样append3,series=[1,1,2,3]
- 代码1:
接下来的赋值步骤差异放大:
代码1:
a = b→a变成2(当前b的值)b = a + b→ 这里的a已经是新的2,b还是原来的2,所以b=2+2=4
此时状态:a=2,b=4
代码2:
a,b = b, a+b→ 右边的b是原来的2,a+b是原来的1+2=3,所以同时把a设为2,b设为3
此时状态:a=2,b=3
从第二次循环之后,a和b的值就完全不一样了,后续生成的数列自然也会差异越来越大。
总结
代码2的同时赋值方式才是符合斐波那契数列逻辑的:每一步的新值都是基于前两个旧值计算的。而代码1的分步赋值因为先更新了a,导致计算b时用了新的a,破坏了斐波那契数列的递推关系,所以输出结果错误。
内容的提问来源于stack exchange,提问作者Zeusthunder1
相关产品推荐
相关产品推荐

