默认参数如何在python

时间:2016-05-15 02:00:10

标签: python

我刚读了一篇文章:The 10 Most Common Mistakes That Python Developers Make。问题#1仍然困扰着我很多。我将用下面的代码描述我的问题。

>>>def foo(bar=[]):
...    bar.append("baz")
...    return bar
>>> foo()
["baz"]
>>> foo()
["baz", "baz"]

它不起作用,文章中的答案说列表是一个可以多种类型,默认值在通话期间会发生变化。但是当我尝试这个时

def foo(bar=[]):
    if bar == []:bar=[]
...

它有效,那么有什么区别呢?

2 个答案:

答案 0 :(得分:4)

默认参数是在Python的函数定义中创建的。这意味着当您提供列表作为默认参数时,该列表将持续存在于未显式传递该参数的所有函数调用。在第二个示例中,您将参数重新分配给不同的值。这会创建一个新列表并解决问题。一个更常见的解决方案" bug" /"功能"是为默认参数赋值None,然后在函数顶部检查它。这看起来像这样:

def foo(bar=None):
    if bar is None:
        bar = []

但是,您在第二个示例中编写的代码实现了相同的效果。

答案 1 :(得分:0)

在您的代码中,您使用默认参数为bar分配新列表。现在,如果您修改新列表,当然不会在默认参数中显示更改,这是不同的对象。

典型的解决方案是将None分配给默认参数,并在函数开头显式检查它:

def foo(bar=None):
    if bar is None:
        bar = []

请注意,虽然它看起来很像您的版本但存在差异:

def foo(bar=[]):
    if bar == []:
        bar = []
    bar.append(1)

def foo2(bar=None):
    if bar is None:
        bar = []
    bar.append(1)

l = []
foo(l)
print l # []

l = []
foo2(l)
print l # [1]