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

Python用含列表元素的索引做同步赋值时结果不符合预期问题

问题原因

你对Python同步赋值的「右侧先统一求值」的理解是正确的,出错的核心点是:赋值语句左侧的目标地址解析是按从左到右的顺序逐个执行的,并非和右侧一样提前统一计算。

具体到你的代码执行顺序如下:

  1. 先计算右侧两个值:此时arr为初始值[4, 2, 1, 3]
    • 第一个右侧值:arr[arr[0]-1] = arr[4-1] = arr[3] = 3
    • 第二个右侧值:arr[0] = 4
    • 右侧最终打包为元组(3, 4),这一步和你的预期完全一致
  2. 再按从左到右的顺序给左侧目标赋值:
    • 第一步:将右侧第一个值3赋给arr[0],此时arr变为[3, 2, 1, 3]
    • 第二步:解析左侧第二个目标的索引arr[0]-1,此时arr[0]已经被修改为3,所以索引为3-1=2,最终将右侧第二个值4赋给arr[2],得到最终结果[3, 2, 4, 3]
解决方案

只需要提前把两个需要交换的索引计算完成、存储为独立变量,避免在左侧目标中嵌套会被前面赋值修改的数组元素即可,适配你用迭代变量i的场景写法如下:

arr = [4, 2, 1, 3]
i = 0 # 你的迭代变量,可动态变化
# 提前计算要交换的第二个索引,不受后续赋值影响
target_pos = arr[i] - 1
# 执行交换
arr[i], arr[target_pos] = arr[target_pos], arr[i]

运行后得到的arr就是你预期的[3, 2, 1, 4]。

内容的提问来源于stack exchange,提问作者Sopeade Lanlehin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 15:18:03