在Python中默认函数参数的生命周期

这个问题在这里已经有了答案:

  • “最小的惊讶”和可变的默认参数30的答案

  • 由于参数是函数对象的一个​​属性,它通常具有与该函数相同的生命周期。 通常,函数从模块加载的那一刻起,直到解释器退出。

    但是,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