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

如何定义交换列表前两位元素且不修改原输入列表的函数?

问题原因

列表是Python中的可变对象,你当前的实现直接对传入的列表参数做索引赋值,操作的是原列表的内存地址指向的数据,因此会修改原始输入列表。

实现方案

核心逻辑是:不直接修改原列表,先基于原列表生成一个新的列表对象,再对新列表执行交换操作后返回。

方案1:先拷贝原列表再交换

这是可读性最高的写法:

shiftlist = ['a', 'b', 'c']

def switch(shiftlist):
    # 生成原列表的浅拷贝,常用写法还可以用new_list = list(shiftlist) 或者 new_list = shiftlist.copy()
    new_list = shiftlist[:]
    # 加边界判断,避免列表长度不足2时抛出索引错误
    if len(new_list) >= 2:
        # Python支持直接解包交换元素,无需额外定义holder变量
        new_list[0], new_list[1] = new_list[1], new_list[0]
    return new_list

效果验证

  • 调用函数返回值为 ['b', 'a', 'c']
  • 原始输入列表 shiftlist 始终保持 ['a', 'b', 'c'] 不变

方案2:直接拼接生成新列表

写法更简洁,全程不会操作原列表:

def switch(shiftlist):
    if len(shiftlist) < 2:
        # 长度不足时直接返回原列表的拷贝,避免返回原对象带来意外修改风险
        return shiftlist[:]
    # 直接构造前两位交换后的新列表,拼接剩余元素
    return [shiftlist[1], shiftlist[0]] + shiftlist[2:]
注意事项
  • 仅交换顶层元素的场景下,浅拷贝足够满足需求,不需要使用深拷贝,避免不必要的性能开销
  • 边界判断可以兼容空列表、单元素列表等异常输入,建议保留

内容的提问来源于stack exchange,提问作者grdhjgn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 16:36:01