python函数的默认参数只评估一次?

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

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

  • “默认值仅评估一次”并不意味着具有默认值的参数在函数调用之间保留其值。 这意味着您指定的表达式( def f(a, L=None)None部分)被评估一次,并且它所导致的对象被存储在一个隐藏位置,并且如果该参数没有值是被重用的在通话时给予。 在每次调用时,参数仍会重置为值(默认值或不是)。


    Python通过值将参数传递给函数; 所以对于对象来说,传递的值是对象的引用,而不是对象的新副本。

    这和官方文档的以下部分一起帮助我更好地理解它(重点是我):

    默认参数值在执行函数定义时被评估。 这意味着该表达式在函数被定义时被评估一次,并且每次调用都使用相同的“预先计算”值。 这对于了解默认参数是否为可变对象(例如列表或字典)时尤为重要:如果函数修改对象(例如,通过将项目附加到列表中),则默认值将被有效修改。 [...]解决这个问题的方法是使用None作为默认值,并在函数体中明确地测试它[...]

    把它放在一起:

    如果将参数的默认值定义为可变对象(例如[] ),那么“预先计算的”值就是对该对象的引用,因此对函数的每次调用将始终引用相同的对象,然后可以在该函数的多个调用中被突变。

    但是,由于None是不可变的内置类型,因此缺省值None的“预先计算”值就是这样。 所以每次调用函数时参数都是None

    希望这有助于! 我认为教程本来可以有更好的措辞,因为起初我也对此感到困惑。


    在你的第二个例子中,你有一个变量L 起初LNone 。 您在每次调用时将重新命名为一个新的空列表,然后改变这个新列表。 记住L = []L = list()

    然而,在你的第一个例子中,L在函数声明处被设置为新的列表。 在每次调用函数时,L都不会重置为[] 。 所以你总是在改变同一个列表。

    链接地址: http://www.djcxy.com/p/28521.html

    上一篇: python function default parameter is evaluated only once?

    下一篇: Optional parameters in Python functions and their default values