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
以上内容是否对您有帮助:
更多建议: