You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

两段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:

    1. a = b → a变成1(还是原来的b值)
    2. 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的值)
    2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 13:57:44