Python交换语句顺序差异引发TLE问题的原因咨询
为什么Python中
nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i]会触发无限循环,交换顺序则正常? 核心原因:Python元组解包的求值与赋值顺序
Python里的a, b = c, d这类赋值遵循两个关键步骤:
- 先完整计算等号右侧的所有表达式,把结果暂存为一个元组;
- 按从左到右的顺序,把元组里的值依次赋值给左侧的变量/元素。
当左侧的赋值操作会修改右侧表达式依赖的变量时,赋值顺序的差异就会引发完全不同的行为——这正是你遇到的问题。
结合你的代码场景分析
你的逻辑是把每个正整数x放到数组的x-1位置(即nums[x-1] = x),直到当前位置的元素归位再移动指针i。
错误写法的问题(无限循环)
nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i]
假设当前nums[i] = x,原nums[x-1] = y:
- 右侧计算:先取
nums[x-1]得到y,再取nums[i]得到x,右侧暂存为(y, x); - 左侧赋值:
- 第一步给
nums[i]赋值y,此时nums[i]的值从x变成了y; - 第二步要给
nums[nums[i]-1]赋值x——但此时nums[i]已经是y,所以实际是给nums[y-1]赋值x,而非原本目标位置nums[x-1]。
- 第一步给
这就导致本该被放到x-1位置的x没被正确放置,nums[i]被替换成y后,下一轮循环可能再次触发交换条件,陷入无限循环。
正确写法的逻辑
nums[nums[i]-1], nums[i] = nums[i], nums[nums[i]-1]
同样假设nums[i] = x,原nums[x-1] = y:
- 右侧计算:先取
nums[i]得到x,再取nums[x-1]得到y,右侧暂存为(x, y); - 左侧赋值:
- 第一步给
nums[x-1]赋值x,完成了把x放到正确位置的核心操作; - 第二步给
nums[i]赋值y,此时即使nums[i]的值改变,也不会影响已经完成的第一个赋值操作。
- 第一步给
后续循环会继续处理nums[i]的新值y,直到它归位,最终能正常完成数组的整理。
具体例子验证
比如测试数组nums = [3, 1, 2],i=0时:
- 错误写法执行后:数组会变成
[2, 3, 2],下一轮i=0时nums[0]=2仍满足交换条件,无限循环; - 正确写法执行后:数组会逐步变成
[2,1,3]→[1,2,3],最终i正常递增退出循环,得到正确结果。
结论
普通变量交换时a,b = b,a和b,a = a,b没有区别,但当左侧赋值会改变后续赋值的依赖条件(比如修改列表索引对应的元素)时,两者有本质差异——Python的赋值顺序是从左到右,且右侧表达式的计算是在所有赋值开始前完成的,这直接决定了赋值目标的正确性。
内容的提问来源于stack exchange,提问作者Vidhan Pandey
相关产品推荐
相关产品推荐

