在Python中默认函数参数的生命周期
这个问题在这里已经有了答案:
由于参数是函数对象的一个属性,它通常具有与该函数相同的生命周期。 通常,函数从模块加载的那一刻起,直到解释器退出。
但是,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__
),以便通过重新分配给该属性来清除默认值。
它至少具有与函数对象相同的生命周期(缺少某些时髦)。 因此,如果从其中加载的模块被所有其他模块卸载,并且没有其他引用,那么函数对象及其成员可能会被销毁。
因为Python是垃圾收集的,所以在任何实际意义上你都不需要担心这一点。 如果该对象转义,并且该程序的其他部分有引用,则它将四处移动。
如果你的观点是你想依赖于对象而不是重置,那么是的,你可以这样做,除非你有一些质朴的卸载模块,或者如果你有一些代码分配给函数对象上的变量存储默认值。
链接地址: http://www.djcxy.com/p/28539.html上一篇: Lifetime of default function arguments in python
下一篇: Python: Unexpected behavior using contextmanager on class method