python - python中默认函数参数的生命周期

标签 python

<分区>

我刚开始学习 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__),它是可写的,因此您可以通过重新分配给该属性来清除默认值。

关于python - python中默认函数参数的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16549768/

相关文章:

java - 用不同的值替换文本文件的第二列(正则表达式)

python - Levenshtein 实现能够处理大字符串和向量

python - 无法从 Matplotlib 轴中删除流图箭头

python - 所有可能的因素对

python - 撤消和重做 Tkinter 文本小部件中的功能?

python - 如何使用 Pandas Python 找到相同值的最高计数?

python - 在 Mountain Lion 中执行 ex mkvirtualenv 时出错

python - 生成线性时不变系统根轨迹的 Scipy 函数

python - 无法在 django 中加载配置文件

Pythonic Django 表单 Charfield CSS