PHIL / NOTES
← 返回笔记目录
Python 开发与语法

Python 可变默认参数为什么会串数据

用 None 或工厂让每次调用拥有独立容器。

原理

函数默认参数在定义时求值。把列表写作默认参数,同一个列表会被后续未传参的调用共享。

开发中的做法

需要每次创建新列表时,用 None 作为缺省标记。判断要用 is None,空列表也可能是调用者故意传入的有效参数。

验证与追问

写两次连续调用的测试,检查第一次的内容不会出现在第二次结果里。数据类字段则用 field(default_factory=list)。

代码片段

def append_tag(tag, tags=None):
    if tags is None:
        tags = []
    tags.append(tag)
    return tags