Python函数中的默认参数在哪里
问题内容:
我认为许多人已经看到了接收默认参数的python函数。例如:
def foo(a=[]):
a.append(3)
return a
如果我们使用foo()调用此函数,则每次调用后输出都会附加整数‘3’。
定义此函数后,将在当前环境中定义一个名为“
foo”的函数对象,并且此时还将评估默认参数值。每次在不带参数的情况下调用函数时,所评估的参数值将根据代码进行更改。
我的问题是, 此评估参数在哪里存在? 调用函数时是在函数对象中还是在方法对象中?
由于python中的所有内容都是一个对象,因此必须在某个地方保存’a’-> evaluated参数的name-> value绑定。我是否在考虑这个问题?
问题答案:
正如其他人已经说过的那样,默认值存储在函数对象中。
例如,在CPython中,您可以执行以下操作:
>>> def f(a=[]):
... pass
...
>>> f.func_defaults
([],)
>>> f.func_code.co_varnames
('a',)
>>>
但是,co_varnames
可能包含的名称超过了args的名称,因此它需要进一步处理,而其他Python实现中甚至可能没有这些属性。因此,您应该改用该inspect
模块,它会为您处理所有实现细节:
>>> import inspect
>>> spec = inspect.getargspec(f)
>>> spec
ArgSpec(args=['a'], varargs=None, keywords=None, defaults=([],))
>>>
在ArgSpec
一个名为元组这样你就可以访问所有值的属性:
>>> spec.args
['a']
>>> spec.defaults
([],)
>>>
如文档所述,defaults
元组始终对应于中的n个最后一个参数args
。这为您提供了映射。
要创建字典,您可以执行以下操作:
>>> dict(zip(spec.args[-len(spec.defaults):], spec.defaults))
{'a': []}
>>>