def foo(a, l=[]):
l.append(a)
return l
print foo(10)
Result: [10]
print foo(20)
Result: [10, 20]
为什么会这样?
答案 0 :(得分:2)
这一行:
def foo(a, l=[]):
在定义时创建一个列表。
每次调用函数时都会使用相同的列表。
通常像def foo(a, l="some string"):
这样的东西可以正常工作,但这是因为字符串文字,整数等是不可变的,因此如果函数的每个实例都访问内存中的同一个对象并不重要。另一方面,列表是可变的。
你可以这样解决这个问题:
def foo(a, l=None):
if l is None:
l = []
l.append(a)
return l
这也会创建一个新列表,但仅在执行该函数时才会在本地范围内创建。它不会重复使用同一个。
答案 1 :(得分:1)
当你给python中的一个函数参数赋一个默认值时,它只被初始化为ONCE。 这意味着即使你将你的foo()调用了一百万次,你也会附加到相同的列表中。
答案 2 :(得分:0)
print foo(10)
print foo(20, [])
输出: - [20]
这次您发送了另一个list
引用,因此该值将插入另一个list
参考
如果你这样做
def foo(a, l=[]):
print id(l)
...
...
print foo(10)
print foo(20)
两个时间参考相同
140403877687808
[10]
140403877687808
[10, 20]
而在另一种情况下: -
def foo(a, l=[]):
print id(l)
...
...
print foo(10)
print foo(20, [])
参考更改: -
>>>
140182233489920
[10]
140182233492512
[20]
答案 3 :(得分:0)
这是因为
Default parameter values are always evaluated when, and only when,
the “def” statement they belong to is executed.
“def” is an executable statement in Python, and that default arguments are
evaluated in the “def” statement’s environment. If you execute “def” multiple times,
it’ll create a new function object (with freshly calculated default values) each time.
We’ll see examples of this below.
所以这里在您的代码中,您将列表定义为默认参数。因此,只有在定义函数时才会计算一次。这里引用了"def"
因此,只创建了一个列表对象,无论何时调用函数并附加项目,都会多次使用。
如果您查看列表标识,那么您将发现函数不断返回相同的对象
>>> def foo(l=[]):
... l.append(1)
...return l
>>> id(foo())
12516768
>>> id(foo())
12516768
>>> id(foo())
12516768
实现目标的方法是
def foo(a, l=None):
if l is None:
l = []
#Do your stuff here with list l