Python列表元素交换两种写法差异:为何第二种写法不生效?
Python多重赋值的求值逻辑:为什么第二种交换写法不生效
先明确Python处理这类多重赋值的核心规则:等号右侧的所有表达式会先全部计算完成,把结果暂存起来,再按顺序给左侧的元素/变量赋值。
咱们一步步拆解第二种写法的执行过程:
初始数组:arr = [4,3,2,1,0]
赋值语句:arr[0], arr[arr[0]] = arr[arr[0]], arr[0]
第一步:计算右侧所有表达式的值并暂存
- 先计算
arr[arr[0]]:此时arr[0]的值是4,所以取arr[4],得到结果0 - 再计算
arr[0]:此时它的值还是4
所以右侧最终得到的是(0, 4),这两个值会被临时保存,不受后续数组变化影响。
第二步:按顺序给左侧元素赋值
- 第一个赋值:把右侧第一个值0赋给
arr[0]→ 数组变为[0,3,2,1,0] - 第二个赋值:要给
arr[arr[0]]赋右侧的第二个值4,但此时arr[0]已经变成0了,所以实际是给arr[0]赋值4 → 数组又变回[4,3,2,1,0]
反观第一种写法,idx = arr[0]提前把arr[0]的初始值4存在了变量里,后续的arr[idx]始终指向arr[4],不会因为arr[0]被修改而改变目标位置,所以交换能成功。
简单总结:
多重赋值时右侧先完成所有求值并暂存结果,左侧按顺序执行赋值,前面的赋值会改变数组状态,进而影响后面左侧表达式的计算结果。
内容的提问来源于stack exchange,提问作者Lanok
相关产品推荐
相关产品推荐

