python函数的默认参数只评估一次?
这个问题在这里已经有了答案:
“默认值仅评估一次”并不意味着具有默认值的参数在函数调用之间保留其值。 这意味着您指定的表达式( def f(a, L=None)
的None
部分)被评估一次,并且它所导致的对象被存储在一个隐藏位置,并且如果该参数没有值是被重用的在通话时给予。 在每次调用时,参数仍会重置为值(默认值或不是)。
Python通过值将参数传递给函数; 所以对于对象来说,传递的值是对象的引用,而不是对象的新副本。
这和官方文档的以下部分一起帮助我更好地理解它(重点是我):
默认参数值在执行函数定义时被评估。 这意味着该表达式在函数被定义时被评估一次,并且每次调用都使用相同的“预先计算”值。 这对于了解默认参数是否为可变对象(例如列表或字典)时尤为重要:如果函数修改对象(例如,通过将项目附加到列表中),则默认值将被有效修改。 [...]解决这个问题的方法是使用None作为默认值,并在函数体中明确地测试它[...]
把它放在一起:
如果将参数的默认值定义为可变对象(例如[]
),那么“预先计算的”值就是对该对象的引用,因此对函数的每次调用将始终引用相同的对象,然后可以在该函数的多个调用中被突变。
但是,由于None
是不可变的内置类型,因此缺省值None
的“预先计算”值就是这样。 所以每次调用函数时参数都是None
。
希望这有助于! 我认为教程本来可以有更好的措辞,因为起初我也对此感到困惑。
在你的第二个例子中,你有一个变量L
起初L
指None
。 您在每次调用时将它重新命名为一个新的空列表,然后改变这个新列表。 记住L = []
与L = list()
然而,在你的第一个例子中,L在函数声明处被设置为新的列表。 在每次调用函数时,L都不会重置为[]
。 所以你总是在改变同一个列表。
上一篇: python function default parameter is evaluated only once?
下一篇: Optional parameters in Python functions and their default values