【问题标题】:Optional parameters in functions and their mutable default values [duplicate]函数中的可选参数及其可变默认值
【发布时间】:2011-09-20 02:49:12
【问题描述】:

可能重复:
“Least Astonishment” in Python: The Mutable Default Argument

我对可选参数在 Python 函数/方法中的工作方式有点困惑。

我有以下代码块:

>>> def F(a, b=[]):
...     b.append(a)
...     return b
...
>>> F(0)
[0]
>>> F(1)
[0, 1]
>>>

为什么F(1) 返回[0, 1] 而不是[1]?

我的意思是,里面发生了什么?

【问题讨论】:

  • 您可以通过在附加到列表之前打印 b 的值轻松地看到这一点。 :)

标签: python parameters parameter-passing optional-parameters


【解决方案1】:

几年前来自 PyCon 的好文档 - Default parameter values explained。但基本上,由于列表是可变对象,并且在函数定义时计算关键字参数,因此每次调用函数时,都会得到相同的默认值。

正确的做法是:

def F(a, b=None):
    if b is None:
        b = []
    b.append(a)
    return b

【讨论】:

    【解决方案2】:

    Default parameters 很直观地有点像函数对象上的成员变量。

    在执行函数定义时评估默认参数值。这意味着在定义函数时对表达式进行一次评估,并且每次调用都使用相同的“预计算”值。当默认参数是可变对象(例如列表或字典)时,这一点尤其重要:如果函数修改了对象(例如,通过将项目附加到列表中),则默认值实际上已被修改。

    http://docs.python.org/reference/compound_stmts.html#function

    列表是可变对象;您可以更改它们的内容。获取默认列表(或字典或集合)的正确方法是在运行时在函数内部创建它:

    def good_append(new_item, a_list=None):
        if a_list is None:
            a_list = []
        a_list.append(new_item)
        return a_list
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-22
      • 2022-11-24
      • 1970-01-01
      • 2011-05-07
      • 1970-01-01
      • 1970-01-01
      • 2012-02-27
      相关资源
      最近更新 更多