Python中x,y = y,y+x与x=y,y=x+y的差异原因解析
为什么两种赋值方式的斐波那契数列输出不同?
这是个非常典型的Python赋值逻辑问题,核心差异在于普通顺序赋值和元组解包式并行赋值的执行机制不一样,我给你一步步拆解清楚:
先看第一段代码的问题
第一段用的是顺序赋值:
def fib(n): x = 0 y = 1 print x for i in range(n): x = y y = x+y print x return x
当n=5时,每一步的变量变化是这样的:
- 初始状态:
x=0,y=1→ 先输出0 - 第1次循环:
x = y→x被更新为1(此时y还是原来的1)y = x + y→ 这里用的是已经被修改后的x=1,加上原来的y=1,得到y=2- 输出
x=1
- 第2次循环:
x = y→x变成2y = x + y→ 用新的x=2 + 当前y=2,得到y=4- 输出
x=2
- 后续循环以此类推,每次计算y的时候,x已经是新值,导致y变成了之前的2倍,最终输出
0 1 2 4 8 16,完全偏离了斐波那契数列的逻辑。
再看第二段代码的正确逻辑
第二段用的是Python的并行赋值(元组解包):
def fib(n): x,y = 0,1 print x for i in range(n): x,y = y,x+y print x return x
这种赋值方式的关键是:Python会先一次性计算右边所有表达式的值,把它们暂存到一个临时元组里,再依次赋值给左边的变量。也就是说,x和y的更新都是基于赋值前的原始值,不会互相干扰。
同样用n=5走一遍:
- 初始状态:
x=0,y=1→ 输出0 - 第1次循环:
- 先计算右边:
y=1,x+y=0+1=1→ 得到临时元组(1,1) - 把元组的值分别赋值给
x和y→x=1,y=1 - 输出
x=1
- 先计算右边:
- 第2次循环:
- 计算右边:
y=1,x+y=1+1=2→ 临时元组(1,2) - 赋值后:
x=1,y=2 - 输出
x=1
- 计算右边:
- 后续循环里,每次计算
x+y用的都是上一轮的旧x和旧y,完美符合斐波那契数列前两项之和等于后一项的规则,最终输出0 1 1 2 3 5。
总结核心区别
- 顺序赋值:前一个赋值会修改变量的值,后一个赋值会使用修改后的新值,变量更新有先后依赖。
- 并行赋值:右边所有表达式先计算完成(基于变量的原始值),再统一赋值给左边变量,变量更新是同步的,不会互相影响。
内容的提问来源于stack exchange,提问作者user9654395
相关产品推荐
相关产品推荐

