可能重复:
“Least Astonishment” in Python: The Mutable Default Argument
我最近在Python中遇到了一个问题。 代码:
def f(a, L=[]):
L.append(a)
return L
print f(1)
print f(2)
print f(3)
输出将是
[1]
[1, 2]
[1, 2, 3]
但是为什么本地列表中的值:函数f中的L保持不变? 因为L是一个局部变量,我认为输出应该是:
[1]
[2]
[3]
我尝试了另一种实现此功能的方法: 代码:
def f(a, L=None):
if L is None:
L = []
L.append(a)
return L
这次输出是:
[1]
[2]
[3]
我只是不明白为什么...... 有没有人有想法?非常感谢。
答案 0 :(得分:3)
默认参数实际上是在定义函数时初始化的,所以
def f(L = []): pass
与
非常相似global default_L = []
def f(L = default_L): pass
您可以通过这种方式看到它与函数的每次调用中使用的列表对象相同。
答案 1 :(得分:2)
def f(a, L=[])
中的列表定义为定义了函数。每次调用没有关键字参数的函数时,它都是相同的列表。
将关键字设置为None
并按照您的方式检查/创建是这种行为的常用方法。