Python中Fibonacci代码因分行赋值出错的原因解析
为什么你的斐波那契代码和官方版本结果不一样?
嗨~作为刚接触Python和社区的新手,遇到这种变量赋值的坑太正常啦!核心问题就出在Python的并行赋值(同一行赋值)和顺序分行赋值的差异上,我给你拆解清楚:
先看两段代码对比
你的代码(分行赋值)
a, b = 0, 1 while b < 10: print(b) a = b # 先把a更新成当前b的值 b = a + b # 这里的a已经是新值了,不是原来的a
官方文档的代码(并行赋值)
a, b = 0, 1 while b < 10: print(b) a, b = b, a + b # 先计算右边所有值,再一次性赋值给左边
关键差异在哪里?
Python的并行赋值会先把等号右边所有表达式的结果都计算出来,存储到临时空间里,再一次性把这些值赋值给左边的变量。也就是说,a, b = b, a + b里的a + b用的是赋值前的a和b,两者的更新互不干扰。
而你的分行赋值是顺序执行的:
- 先执行
a = b,这时候a已经变成了当前b的值; - 再执行
b = a + b,这里的a已经是新的a(也就是原来的b),所以b变成了b + b(翻倍),而不是斐波那契数列需要的「前两项之和」。
举个具体循环步骤验证
以第一次循环为例:
- 初始状态:
a=0,b=1 - 你的代码:
- 打印
1 a = b→a=1b = a + b→b=1+1=2
- 打印
- 官方代码:
- 打印
1 - 先计算右边:
b=1,a+b=0+1=1 - 一次性赋值:
a=1,b=1
- 打印
继续循环下去,你会发现你的代码输出的是1,2,4,8(翻倍序列),而官方代码输出的是标准斐波那契序列1,1,2,3,5,8。
总结
如果需要基于变量的旧值同时更新多个变量,一定要用Python的并行赋值(同一行多变量赋值),这样能避免因顺序赋值导致的变量值被提前覆盖的问题~
内容的提问来源于stack exchange,提问作者Neild
相关产品推荐
相关产品推荐

