Python函数:可选参数计算一次?

psp*_*cil 3 python

Python教程4.7.1.默认参数值表示以下内容:

重要警告:默认值仅评估一次.当默认值是可变对象(如列表,字典或大多数类的实例)时,这会有所不同.例如,以下函数累积在后续调用中传递给它的参数:

def f(a, L=[]):
    L.append(a)
    return L

print f(1)
print f(2)
print f(3)
Run Code Online (Sandbox Code Playgroud)

这将打印

[1]
[1, 2]
[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

在内存管理方面,我不太明白"仅评估一次"的含义.显然,函数的默认值在首次调用函数时被计算一次,并且即使在函数结束后也存储在单独的存储器地址中.(根据我的理解,在函数结束后,应该释放所有局部变量?)

我对么?

Mar*_*ers 10

在Python中,函数也是对象,默认值与函数对象一起存储.默认值不是本地人; 只是在调用函数时,如果没有给出显式值,则参数绑定到默认值.

当Python遇到一个def <functionname>(<arguments>):声明,它为你创建一个函数对象那里,然后,这是'定义时间'; 该函数不会被调用,而只是被创建.这是然后,默认被评估并存储,在功能对象的属性.

然后,当您调用该函数时,默认值已经创建,并且在您没有为参数提供更具体的值时使用.因为默认值与函数对象一起存储,所以您可以看到函数调用之间对可变对象的更改.

本地人当然仍然被清理,但由于它们是引用(Python中的所有标识符都是),所以它们绑定的对象只有在没有其他任何引用它们的情况下才被清除.

您可以查看任何函数对象的默认值:

>>> def foo(bar='spam', eggs=[]):
...     eggs.append(bar)
...     return eggs
... 
>>> foo.__defaults__
('spam', [])
>>> foo()
['spam']
>>> foo.__defaults__
('spam', ['spam'])
>>> foo() is foo.__defaults__[1]
True
Run Code Online (Sandbox Code Playgroud)

foo()函数有一个__defaults__属性,当没有传入参数值时使用的默认值元组.您可以看到可变列表在调用函数时发生更改,并且因为函数返回eggs列表,您还可以看到它该元组中的第二个值完全相同.