默认参数是什么_如何为函数设置默认值【教程】

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 是唯一可靠的选择。它不参与业务逻辑,只作存在性判断。

  • 避免用 False0"" 做默认值判据,它们可能是有效输入
  • 检查必须用 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 判”“顺序不能乱”,就能避开绝大多数坑。