使用可变默认参数,如何从函数外部访问对象?

Using a mutable default argument, how to access the object from outside the function?

如果我有这样的东西:

def f(x, cache=[]):
    cache.append(x)

如何从外部 f 访问 cache

函数范围内的变量不应该在外部访问。

你应该做的是使用一个全局变量来存储你的缓存:

GLOBAL_CACHE = []

def f(x, cache=GLOBAL_CACHE):
    cache.append(x)

你可以使用__defaults__魔法:

>>> def f(x, cache=[]):
...     cache.append(x)
>>> f.__defaults__
([],)
>>> f(2)
>>> f.__defaults__
([2],)
>>> f('a')
>>> f.__defaults__
([2, 'a'],)
>>> c, = f.__defaults__
>>> c
[2, 'a']

为了完整起见,也可以使用inspect.getfullargspec,更明确一点:

>>> import inspect
>>> inspect.getfullargspec(f)
FullArgSpec(args=['x', 'cache'], varargs=None, varkw=None, defaults=([2, 'a'],), kwonlyargs=[], kwonlydefaults=None, annotations={})
>>> inspect.getfullargspec(f).defaults
([2, 'a'],)