Python中的可变默认参数

Python中的可变默认参数,python,Python,可能重复: 我编写了以下python程序: #!/usr/bin/env python def bug( numbers = [] ): numbers.append( 1 ) return numbers print bug() print bug() 我期望的结果是 [1] [1] 但是我有 [1] [1, 1] 这是一个bug吗?不,这不是bug,这种行为在Python中已经存在很长时间了 问题是list对象是可变的,也就是说,您可以更改它,并且当您调用函数时,

可能重复:

我编写了以下python程序:

#!/usr/bin/env python

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

print bug()
print bug()
我期望的结果是

[1]
[1]
但是我有

[1]
[1, 1]

这是一个bug吗?

不,这不是bug,这种行为在Python中已经存在很长时间了

问题是list对象是可变的,也就是说,您可以更改它,并且当您调用函数时,不会得到新的默认值。发生的事情是这样的:

def bug( numbers = [] ):
   numbers.append( 1 )
   return numbers
此时已创建函数
bug
,并创建了作为
numbers
默认值的列表

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

print bug()
当我们再次调用该函数时,我们得到与之前相同的列表,因此列表中添加了两个
1
s

通常的解决方案是按如下方式定义函数:

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

请阅读以了解更多详细信息。

numbers=[]
仅计算一次(定义函数时)。所以总是一样的清单

要避免这种情况,请按如下方式更改函数:

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