Python函数默认参数在定义时求值一次,可变对象作默认值会导致状态污染;应使用None判空并重建对象,且无默认值参数须在有默认值参数之前。

Python 函数的默认参数不是“可有可无的装饰”,而是直接影响调用逻辑和对象生命周期的关键机制;设错默认值(比如用 [] 或 {})会导致意外的跨调用状态污染。
默认参数在函数定义时就完成求值
Python 中所有默认参数表达式,在函数被定义(def 语句执行)时即求值一次,而不是每次调用时重新计算。这意味着可变对象(如列表、字典)作为默认值会持续复用。
- 错误写法:
def append_to(items=[], item="x"): items.append(item); return items—— 多次调用会累积元素 - 正确写法:
def append_to(items=None, item="x"): items = items or []; items.append(item); return items - 更推荐写法:
def append_to(items=None, item="x"): items = [] if items is None else items; items.append(item); return items
None 是最安全的默认占位符
当需要“无值”语义且允许传入空列表、空字典等合法值时,None 是唯一可靠的选择。它不参与业务逻辑,只作存在性判断。
家电公司网站源码是一个以米拓为核心进行开发的家电商城网站模板,程序采用metinfo5.3.9 UTF8进行编码,软件包含完整栏目与数据。安装方法:解压上传到空间,访问域名进行安装,安装好后,到后台-安全与效率-数据备份还原,恢复好数据后到设置-基本信息和外观-电脑把网站名称什么的改为自己的即可。默认后台账号:admin 密码:132456注意:如本地测试中127.0.0.1无法正常使用,请换成l
- 避免用
False、0、""做默认值判据,它们可能是有效输入 - 检查必须用
is None,而非== None(虽通常等效,但风格和语义更准确) - 如果函数内部要修改默认对象,务必先做深拷贝或重建,例如:
config = copy.deepcopy(default_config) if config is None else config
位置参数不能跟在带默认值的参数后面
Python 语法强制要求:所有不带默认值的形参必须出现在带默认值的形参之前。否则报 SyntaxError: non-default argument follows default argument。
- 错误示例:
def bad(a=1, b): pass→ 直接语法错误 - 正确顺序:
def good(a, b=1, c="x"): pass - 混合使用时注意调用歧义:若同时支持位置与关键字传参,建议用
*强制关键字参数(如def f(x, *, y=1)),避免调用方误传顺序
默认参数看着简单,真正麻烦的是它把“定义时”和“运行时”的边界悄悄抹平了;只要记住“可变对象别直接当默认值”“没值就用 None 判”“顺序不能乱”,就能避开绝大多数坑。









