Python多变量并行赋值执行顺序疑问:列表索引赋值结果不符预期
核心原理
Python 的多重赋值执行逻辑严格遵循以下顺序,不存在真正的“完全同时执行”:
- 第一步:先从左到右计算等号右侧所有表达式的结果,全部存入临时元组缓存,这一步不会修改任何原有变量的值
- 第二步:再从左到右依次将临时元组中的值赋值给等号左侧的目标,且每个左侧目标的寻址(比如
nums[i]对应的具体下标位置)是在赋值到该目标的那一刻才会计算,不会提前预存。
第一段代码执行过程
代码:
i=0 nums[i],i=None,nums[i] print(i,nums)
- 计算右侧表达式:第一个值为
None,第二个值为nums[i](此时i仍为初始值0,所以nums[0]=3),缓存的临时元组为(None, 3) - 按顺序给左侧赋值:
- 先给第一个目标
nums[i]赋值:此时i还未被修改,仍是0,所以将nums[0]设为None - 再给第二个目标
i赋值:将i设为缓存的3
最终输出3 [None, 2, 1, 0],和预期一致。
- 先给第一个目标
第二段代码执行过程
代码:
i=0 i,nums[i]=nums[i],None print(i,nums)
- 计算右侧表达式:第一个值为
nums[i](此时i为0,nums[0]=3),第二个值为None,缓存的临时元组为(3, None) - 按顺序给左侧赋值:
- 先给第一个目标
i赋值:将i设为缓存的3 - 再给第二个目标
nums[i]赋值:此时计算i的值已经是3,所以是将nums[3]设为None,完全不会修改nums[0]
最终输出3 [3, 2, 1, None],差异的根源就是左侧赋值是顺序执行,后一个目标的寻址依赖已经修改后的i值。
- 先给第一个目标
内容的提问来源于stack exchange,提问作者waw waw
相关产品推荐
相关产品推荐

