Python 默认参数值规范 | Google 官方避坑指南

2025-07-23 11:06 更新

默认参数值

Tip

大部分情况下允许。

定义:

你可以为参数列表的最后几个参数赋予默认值,例如,def foo(a, b = 0):
如果调用foo时只带一个参数,则b为0。
如果调用时带两个参数,则b的值等于第二个参数。

优点:

很多时候,你需要一个拥有大量默认值的函数,并且偶尔需要覆盖这些默认值。
通过默认参数值可以轻松实现这种功能,不需要为了覆盖默认值而编写大量额外的函数。
同时,Python不支持重载方法和函数,而默认参数的写法可以轻松”仿造”重载行为。

缺点:

默认参数在模块被导入时求值且只计算一次。
如果值是列表和字典等可变类型,就可能引发问题。
如果函数修改了这个值(例如往列表内添加元素),默认值就变化了。

结论:

可以使用,不过有如下注意事项:
函数和方法的默认值不能是可变 (mutable) 对象。

正确

def foo(a, b=None):
    if b is None:
        b = []
def foo(a, b: Optional[Sequence] = None):
    if b is None:
        b = []
def foo(a, b: Sequence = ()):  # 允许空元组,因为元组是不可变的

错误


from absl import flags
_FOO = flags.DEFINE_string(...)


def foo(a, b=[]):
    ...
def foo(a, b=time.time()):  # 确定要用模块的导入时间吗???
    ...
def foo(a, b=_FOO.value):  # 此时还没有解析 sys.argv...
    ...
def foo(a, b: Mapping = {}):  # 可能会赋值给未经过静态检查 (unchecked) 的代码
    ...
```Google
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号