Python一行多变量赋值交换列表元素失效原因解析
Python列表索引交换失效的原因解析
问题的核心在于Python赋值语句的执行顺序,以及左侧赋值目标的索引依赖了被修改后的列表值,导致交换操作被抵消。
分步拆解你的代码执行过程
初始状态:nums = [4, 3, 2, 1],i = 1
执行语句 nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i] 时:
- 先完整计算右侧所有表达式:
- 计算
nums[nums[i]-1]:nums[i]取初始值3,减1得索引2,对应值为2; - 计算
nums[i]:取初始值3; - 右侧最终生成临时元组
(2, 3)。
- 计算
- 依次给左侧目标赋值:
- 第一个赋值:
nums[i] = 2→nums变为[4, 2, 2, 1]; - 第二个赋值:此时计算
nums[i]-1,nums[i]已经被修改为2,减1得索引1,于是给nums[1]赋值3 →nums变回初始状态[4, 3, 2, 1]。
- 第一个赋值:
常量索引交换生效的原因
使用 nums[1], nums[2] = nums[2], nums[1] 时,左侧的索引是固定常量,不会因为列表值的变化而改变:
右侧生成元组 (2, 3) 后,依次给 nums[1] 赋值2、nums[2] 赋值3,最终得到 [4, 2, 3, 1]。
正确的变量索引交换写法
要避免索引被中途修改的问题,需要提前把依赖的索引值保存到临时变量中:
nums = [4, 3, 2, 1] i = 1 j = nums[i] - 1 # 提前保存目标索引,此时j=2 nums[i], nums[j] = nums[j], nums[i] print(nums) # 输出: [4, 2, 3, 1]
内容的提问来源于stack exchange,提问作者Nifall
相关产品推荐
相关产品推荐

