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