Python单行多变量赋值执行顺序疑问——以斐波那契代码为例
嘿,我来帮你把这个问题掰扯明白!
先搞懂Python多变量赋值的核心机制
你之前猜的两种执行顺序都不对,因为Python里的单行多变量赋值是先一次性计算等号右边所有表达式的值,再把这些值分别赋值给左边的变量,不是按顺序逐个赋值的。也就是说,a, b = b, a+b这行代码里,右边的b和a+b会先被计算出来(用的是赋值前的a和b的值),然后再把这两个结果分别赋给a和b。
手动模拟fib2函数的执行过程
我们把代码贴出来,一步步走一遍,你就清楚开头的1 1 2 3是怎么来的了:
def fib2(n): # return Fibonacci series up to n result = [] a, b = 0, 1 while b < n: result.append(b) a, b = b, a+b return result
当n=1000时,执行步骤:
- 初始状态:
a=0,b=1,result=[] - 第一次进入循环(
b=1 < 1000成立):result.append(b)→result变成[1]- 执行
a, b = b, a+b:先算右边,b当前是1,a+b是0+1=1;然后把这两个值赋给左边,所以a=1,b=1
- 第二次进入循环(
b=1 < 1000成立):result.append(b)→result变成[1, 1]- 执行
a, b = b, a+b:右边计算得1和1+1=2;赋值后a=1,b=2
- 第三次进入循环(
b=2 < 1000成立):result.append(b)→result变成[1, 1, 2]- 执行
a, b = b, a+b:右边计算得2和1+2=3;赋值后a=2,b=3
- 第四次进入循环(
b=3 < 1000成立):result.append(b)→result变成[1, 1, 2, 3]- 继续执行后续步骤,就得到你看到的完整数列了
为什么你的两种猜测都不对?
你之前想的两种顺序都是逐个赋值,但Python不是这么玩的:
- 第一种:
a = b→a=1,然后b = a+b→b=1+1=2,这样第二次循环append的是2,开头就变成1,2,和实际结果不符 - 第二种:
b = a+b→b=0+1=1,然后a = b→a=1,这一步看似和正确结果一样,但如果继续往下走,第三次循环时a=1,b=1,执行b=a+b会得到2,a=b得到2,那第三次append的是2,然后b=2+2=4,接下来append的是4,数列就变成1,1,2,4,明显不对
所以核心就是记住:Python的多变量赋值是“先算全右边,再一次性赋值左边”,不会在赋值过程中用新值覆盖旧值影响计算。
内容的提问来源于stack exchange,提问作者avi
相关产品推荐
相关产品推荐

