You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python一行多变量赋值交换列表元素失效原因解析

Python列表索引交换失效的原因解析

问题的核心在于Python赋值语句的执行顺序,以及左侧赋值目标的索引依赖了被修改后的列表值,导致交换操作被抵消。

分步拆解你的代码执行过程

初始状态:nums = [4, 3, 2, 1],i = 1
执行语句 nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i] 时:

  1. 先完整计算右侧所有表达式:
    • 计算 nums[nums[i]-1]:nums[i] 取初始值3,减1得索引2,对应值为2;
    • 计算 nums[i]:取初始值3;
    • 右侧最终生成临时元组 (2, 3)。
  2. 依次给左侧目标赋值:
    • 第一个赋值: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 17:15:53