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

上一篇: Mutable default arguments in Python

下一篇: Pass a list to a class python