为何Python中arr[n:].extend(arr[:n])未实现列表左移,输出原数组?
列表左移操作的结果差异解析
问题场景
调用LShift(arr, 2)时,第一个示例输出原数组,第二个示例输出正确左移后的数组,以下是两个示例代码及结果:
示例1(无预期左移效果)
def LShift(arr,n): arr[n:].extend(arr[:n]) # 误以为会修改原数组 print(arr) arr = [10,20,54,5656,30,40,12,11] LShift(arr,2)
输出:[10,20,54,5656,30,40,12,11]
示例2(正确实现左移)
def LShift(arr, n): a1 = arr[n:] a2 = arr[:n] a1.extend(a2) arr = a1 print(arr) arr = [10, 20, 54, 5656, 30, 40, 12, 11] LShift(arr, 2)
输出:[54,5656,30,40,12,11,10,20]
差异原因
示例1的问题:
arr[n:]是对原列表做切片操作,Python中列表切片会返回一个新的列表对象,而非原列表的引用。你调用arr[n:].extend(arr[:n])时,只是给这个临时生成的新列表追加了元素,原列表arr完全没被改动,所以打印原列表还是初始状态。示例2的逻辑:
a1 = arr[n:]同样生成新列表,a1.extend(a2)将前n个元素追加到a1末尾,得到了左移后的完整列表。随后arr = a1是把函数内部的局部变量arr指向这个新生成的列表,最后打印的是这个新列表,因此得到了预期的左移结果。
补充:真正修改原列表的左移写法
如果想直接修改原列表实现左移,应该用切片赋值:
def LShift(arr, n): arr[:] = arr[n:] + arr[:n] print(arr)
这种写法会直接替换原列表的所有元素,外部的原列表也会被修改。
内容的提问来源于stack exchange,提问作者Carl_M
相关产品推荐
相关产品推荐

