Python编写list_updater函数多次调用出现参数累加问题如何解决?
问题根源
你遇到的参数累加问题和*argv完全无关,是Python可变默认参数的固有特性:
- 函数定义阶段就会完成默认参数的初始化,后续所有不传该参数的调用,都会复用同一个初始化好的对象
- 你将
collection的默认值设为[],且判断逻辑仅在collection == None时才重置为空列表,该判断永远不会触发,每次调用都是往同一个初始列表中追加内容,自然就会出现多次调用结果累加的问题。
修复方案
修改默认参数为不可变的None,每次调用时如果没有传入collection就新生成空列表,同时建议复制传入的collection内容,避免修改用户传入的原列表对象。
修复后的代码如下:
def list_updater(*argv, collection=None): # 未传入collection时使用新的空列表 if collection is None: result = [] else: # 复制原collection内容,不修改外部传入的列表 result = collection.copy() # 追加所有位置参数 result.extend(argv) return result
效果验证
运行你的测试用例:
print(list_updater(1,2,3)) print(list_updater('test','test')) print(list_updater(9, 10, 25, collection=[7]))
输出结果完全符合预期:
[1, 2, 3] ['test', 'test'] [7, 9, 10, 25]
内容的提问来源于stack exchange,提问作者NoName
相关产品推荐
相关产品推荐

