如何定义交换列表前两位元素且不修改原输入列表的函数?
问题原因
列表是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
相关产品推荐
相关产品推荐

