我刚读了一篇文章: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=[]
...
它有效,那么有什么区别呢?
答案 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]