如何解决Python默认参数仅在定义时求值的问题?
Python 默认参数调用时求值的实现方案
Python存在一个特殊特性:默认参数仅会在函数或方法定义时求值一次。以下示例代码可展示该特性:
from datetime import datetime import time def some_func(ts: datetime = datetime.now()): print("What time is it 'now'?",ts) some_func() time.sleep(5) # 休眠5秒 some_func()
运行后输出如下:
What time is it 'now'? 2023-08-08 18:43:43.697853 What time is it 'now'? 2023-08-08 18:43:43.697853
这个行为虽有官方文档记录,但和Scala、Java等数十种语言的逻辑不同。要实现默认参数在函数调用时求值,最常用且简单的方案是用None作为默认占位符,在函数内部动态生成实际默认值:
from datetime import datetime import time def some_func(ts: datetime | None = None): # 当未传入参数时,在调用时生成默认值 if ts is None: ts = datetime.now() print("What time is it 'now'?", ts) some_func() time.sleep(5) some_func()
这段代码运行后,两次调用会输出不同的时间戳——因为每次调用时都会执行datetime.now()获取当前时间。
原理很直接:None是Python的不可变单例对象,定义函数时求值不会产生副作用;而函数每次被调用时,都会执行内部的判断逻辑,动态生成需要的默认值,完美解决默认参数提前求值的问题。
内容的提问来源于stack exchange,提问作者WestCoastProjects
相关产品推荐
相关产品推荐

