Python中可变的默认参数

时间:2011-11-24 12:51:47

标签: python

  

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

我编写了以下python程序:

#!/usr/bin/env python

def bug( numbers = [] ):
    numbers.append( 1 )
    return numbers

print bug()
print bug()

我期望的结果是

[1]
[1]

但我得到了

[1]
[1, 1]

这是一个错误吗?

2 个答案:

答案 0 :(得分:0)

不,这不是一个错误,这种行为已经在Python中存在了很长时间。

问题是列表对象是可变的,即你可以改变它,当你调用一个函数时,你没有得到一个新的默认值。发生了什么事:

def bug( numbers = [] ):
   numbers.append( 1 )
   return numbers

此时已创建函数bug并创建了numbers的默认值列表。

print bug()

现在我们调用了一次bug并将1添加到定义函数时创建的列表中。

print bug()

当我们再次调用该函数时,我们得到与之前相同的列表,因此我们将两个1添加到列表中。

通常的解决方案是按如下方式定义您的功能:

def bug(numbers = None):
    if numbers is None:
        numbers = []
    numbers.append(1)
    return numbers

阅读this了解详情。

答案 1 :(得分:0)

numbers=[]仅评估一次(定义函数时)。所以它总是相同的列表。

要避免这种情况,请更改以下功能:

def not_a_bug(numbers=None):
    if numbers is None:
        numbers = []
    numbers.append(1)
    return numbers