我刚开始学习 python,对默认参数的概念感到震惊。
在 python 文档中提到,函数的默认参数值仅在遇到 def
语句时计算一次。这使得不可变和可变默认函数参数的值存在很大差异。
>>> def func(a,L=[]):
L.append(a)
return L
>>> print(func(1))
[1]
>>> print(func(2))
[1, 2]
这里可变函数参数 L 保留了最后分配的值(因为默认值不是像 C 中那样在函数调用期间计算的)
Python 中默认参数值的生命周期是否就是程序的生命周期(就像 C 中的静态变量)?
编辑:
>>> Lt = ['a','b']
>>> print(func(3,Lt))
['a', 'b', 3]
>>> print(func(4))
[1, 2, 4]
这里在函数调用期间 func(3,Lt)
L
的默认值被保留,它没有被 Lt
覆盖。
默认参数有两个内存吗?一个用于实际默认值(具有程序范围),另一个用于对象传递给它时(具有函数调用范围)?
由于参数是函数对象的一个属性,它通常与函数具有相同的生命周期。通常,函数从加载模块时就存在,直到解释器退出。
但是,Python 函数是一等对象,您可以尽早(动态地)删除对该函数的所有引用。垃圾收集器然后可以获取该函数并随后获取默认参数:
>>> def foo(bar, spam=[]):
... spam.append(bar)
... print(spam)
...
>>> foo
<function foo at 0x1088b9d70>
>>> foo('Monty')
['Monty']
>>> foo('Python')
['Monty', 'Python']
>>> foo.func_defaults
(['Monty', 'Python'],)
>>> del foo
>>> foo
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'foo' is not defined
请注意,您可以直接访问 func_defaults
属性(python 3 中的 __defaults__
),它是可写的,因此您可以通过重新分配给该属性来清除默认值。