在这篇博客中,似乎Python在每次函数调用期间都会记住默认参数值。
http://effbot.org/zone/default-values.htm
但我测试过,似乎没有?例如,第二个函数调用不打印x的值,除了记忆值之外,y仍然是False?
def foo(x, y=False):
if y:
print x
if __name__ == "__main__":
foo(100, True) # print
foo(300) # not print
的问候, 林
答案 0 :(得分:1)
Python在每次通话期间都不会“记住”任何内容。定义函数时,它会保存一次默认值。在您的示例中,定义foo
时,y
的默认值为False。在第一次通话中,您为y
传递了不同的值。该值用于该调用,但不影响默认值。在第二次调用时,您没有明确传递y
的任何内容,因此使用默认值。
默认值并不意味着“最近使用的值”。这是默认值。
答案 1 :(得分:1)
在定义函数时,参数的默认对象只确定一次且仅一次。 (我忽略了从外部扩散到函数对象中并以某种方式更改默认对象的可能性。)如果默认对象不可变,则为False,故事结束。
如果默认对象 是可变的,则可以在不更改对象标识的情况下更改其内容。如果是Lundh引用,则默认对象是列表,列表可以进行变异。每次调用都会看到列表处于当前状态。
答案 2 :(得分:1)
默认对象已创建一次。
也许这个例子会简化说明:
>>> import random
>>>
>>> def func(value=random.random()):
... print value
...
>>>
>>> func()
0.941870977323
>>> func()
0.941870977323
>>> func(1)
1
>>> func()
0.941870977323
>>>
默认值是在定义函数时创建的对象。就我而言,创建的对象是随机值0.941870977323
。
每次调用不带参数的函数时,都会使用相同的默认值。
使用参数调用时,不使用defaut值。
如果默认值为False
,则无关紧要,因为False
是不可变的,因此无论它是旧 False
还是 new False
。
如果默认值可以更改,则必须了解它只创建一次:
[]
创建一个空列表,但如果通过添加元素修改它,则下一个调用将不会创建新的空列表 - 它将使用相同的列表。