可能重复:
“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]
这是一个错误吗?
答案 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