You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 07:50:17