在Python中,当你需要为函数的参数提供默认值时,你可以使用可变对象作为默认值。这可能会导致意外的结果,因为默认值会在函数调用之间共享。为了避免这种情况,你可以使用以下方法来捕获可变的默认参数:
None
作为默认值,并在函数内部初始化可变对象:def my_function(param=None):
if param is None:
param = [] # 初始化一个空列表作为可变对象
# 函数的其余部分
defaultdict
从 collections
模块:from collections import defaultdict
def my_function(param=None):
if param is None:
param = defaultdict(list) # 初始化一个默认为空列表的字典
# 函数的其余部分
lambda
函数作为默认值:def my_function(param=None):
if param is None:
param = lambda: [] # 初始化一个空列表作为可变对象
# 函数的其余部分
def capture_defaults(func):
sig = inspect.signature(func)
@functools.wraps(func)
def wrapper(*args, **kwargs):
ba = sig.bind(*args, **kwargs)
for name, param in sig.parameters.items():
if param.default is not inspect.Parameter.empty:
if isinstance(param.default, list):
ba.arguments[name] = param.default.copy()
return func(*ba.args, **ba.kwargs)
return wrapper
@capture_defaults
def my_function(param=[]):
# 函数的其余部分
这些方法可以确保每次调用函数时都会为可变默认参数创建一个新的实例,避免了意外的结果。
领取专属 10元无门槛券
手把手带您无忧上云