为何Python中此列表交换方式未产生预期修改效果?
问题解析
先拆解你这段代码的执行逻辑:
arr = [4,3,2,1] arr[0], arr[arr[0]-1] = arr[arr[0]-1], arr[0] print(arr)
Python执行多重赋值时,会先把右侧所有表达式的结果计算出来,存入临时元组,再依次给左侧的元素赋值。但这里左侧第二个元素的索引依赖了已经被修改的arr[0],具体步骤如下:
- 先计算右侧:
arr[arr[0]-1]等价于arr[4-1] = arr[3] = 1,arr[0]是4,所以右侧得到元组(1,4)。 - 赋值左侧第一个元素:
arr[0] = 1,此时数组变为[1,3,2,1]。 - 赋值左侧第二个元素:此时计算
arr[0]-1得到0,实际是给arr[0]赋值4,数组又变回初始的[4,3,2,1]。
而你用 arr[0], arr[3] = 1,4 能生效,是因为左侧的索引是固定数值3,不会随arr[0]的修改而变化:
- 右侧元组为
(1,4)。 - 先给
arr[0]赋值1,数组变为[1,3,2,1]。 - 再给
arr[3]赋值4,最终得到预期的[1,3,2,4]。
本质问题就是:多重赋值时,若左侧的索引依赖当前列表的元素,会因为前面的赋值改变元素值,导致索引偏移,最终相当于做了无效操作。
内容的提问来源于stack exchange,提问作者affogato
相关产品推荐
相关产品推荐

