Python中如何在函数调用后重置默认参数中的列表?
实现保留
my_list=[]默认参数且每次重置的技巧 可以实现,以下是两种可行的技巧(虽属于hacky写法,但能满足需求):
方法一:直接修改函数的__defaults__属性
在函数内部每次调用时重置默认参数为新的空列表:
def append_to_list(value, my_list=[]): # 重置默认参数为新的空列表 append_to_list.__defaults__ = ([],) my_list.append(value) return my_list # 测试结果 result1 = append_to_list(1) print(result1) # 输出: [1] result2 = append_to_list(2) print(result2) # 输出: [2] # 显式传入列表也能正常工作 result3 = append_to_list(3, [4]) print(result3) # 输出: [4, 3]
原理:Python函数的__defaults__属性存储了位置默认参数的元组,我们在函数内部每次调用时将默认的列表替换为新的空列表,确保下次使用默认参数时拿到的是全新的列表。
方法二:使用装饰器封装(更通用)
如果需要给多个函数实现这个功能,装饰器是更合适的选择:
def reset_mutable_defaults(func): def wrapper(*args, **kwargs): new_defaults = [] for d in func.__defaults__: # 仅对列表类型的默认参数重置为新空列表,其他类型保持原样 if isinstance(d, list): new_defaults.append([]) else: new_defaults.append(d) func.__defaults__ = tuple(new_defaults) return func(*args, **kwargs) # 保留原函数的元数据(名称、文档字符串等) wrapper.__name__ = func.__name__ wrapper.__doc__ = func.__doc__ return wrapper @reset_mutable_defaults def append_to_list(value, my_list=[]): my_list.append(value) return my_list # 测试结果 print(append_to_list(1)) # 输出: [1] print(append_to_list(2)) # 输出: [2] print(append_to_list(3, [10])) # 输出: [10, 3]
注意:这两种方法都属于技巧性写法,Python官方更推荐使用None作为默认参数的标准写法,因为它的可读性更高,不容易引入潜在问题。但如果你确实需要保持函数签名为my_list=[],上述方法可以满足需求。
内容的提问来源于stack exchange,提问作者iaMeisam
相关产品推荐
相关产品推荐

