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,并且这种行为在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
阅读此以了解更多详情。
numbers=[]
仅被评估一次(当函数被定义时)。 所以它总是一样的列表。
为了避免这种情况,请像这样更改功能:
def not_a_bug(numbers=None):
if numbers is None:
numbers = []
numbers.append(1)
return numbers
链接地址: http://www.djcxy.com/p/28543.html