Python中不同长度子数组执行a,b=b,a交换不符合预期的原因
切片交换出现重复元素的原因及解决方法
先看你的代码:
nums = [1, 2, 3, 4, 5, 6, 7] nums[0:4], nums[4:] = nums[4:], nums[0:4] print(nums) # [5, 6, 7, 5, 1, 2, 3, 4]
问题出在哪?
Python的多重赋值确实会先计算等号右侧的所有值并缓存,但左侧的切片赋值是按顺序执行的,前一次切片赋值会改变列表的长度和元素位置,直接影响后一次的切片范围。
具体执行步骤:
- 先计算右侧两个切片的值并保存:
nums[4:]是[5,6,7],nums[0:4]是[1,2,3,4],这两个值不会被后续修改影响。 - 执行第一个赋值:
nums[0:4] = [5,6,7]。原列表前4个元素被替换成3个元素,此时列表变成[5,6,7,5,6,7](整体长度从7变为6)。 - 执行第二个赋值:
nums[4:] = [1,2,3,4]。此时的列表是[5,6,7,5,6,7],nums[4:]指索引4开始的[6,7],把这部分替换成[1,2,3,4]后,最终列表就成了[5,6,7,5,1,2,3,4]——这就是重复5的由来。
正确的做法
要实现两个切片的顺序交换,应该一次性覆盖整个列表,避免中间修改干扰切片位置:
nums = [1, 2, 3, 4, 5, 6, 7] nums[:] = nums[4:] + nums[:4] print(nums) # [5, 6, 7, 1, 2, 3, 4]
或者先把两个切片的值存到临时变量,再重新赋值:
nums = [1, 2, 3, 4, 5, 6, 7] left = nums[:4] right = nums[4:] nums[:] = right + left
内容的提问来源于stack exchange,提问作者Jadeyyy
相关产品推荐
相关产品推荐

