Python用含列表元素的索引做同步赋值时结果不符合预期问题
问题原因
你对Python同步赋值的「右侧先统一求值」的理解是正确的,出错的核心点是:赋值语句左侧的目标地址解析是按从左到右的顺序逐个执行的,并非和右侧一样提前统一计算。
具体到你的代码执行顺序如下:
- 先计算右侧两个值:此时arr为初始值
[4, 2, 1, 3]- 第一个右侧值:
arr[arr[0]-1]=arr[4-1]=arr[3]=3 - 第二个右侧值:
arr[0]=4 - 右侧最终打包为元组
(3, 4),这一步和你的预期完全一致
- 第一个右侧值:
- 再按从左到右的顺序给左侧目标赋值:
- 第一步:将右侧第一个值
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
相关产品推荐
相关产品推荐

