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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 00:23:13