为什么这个局部变量能在函数中保持其值
可能重复的问题:
Python中的“最小惊讶原则”:可变默认参数
我最近在使用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]
我就是不明白为什么……
有没有人能给点建议?非常感谢。
2 个回答
3
在 def f(a, L=[])
这个函数里,列表是在函数定义的时候就创建好的。每次你调用这个函数而不提供关键字参数时,使用的都是同一个列表。
把关键字参数设置为 None
,然后根据这个来检查或创建列表,就像你做的那样,是解决这种情况的常见方法。
5
默认参数实际上是在函数定义的时候就被初始化了,所以
def f(L = []): pass
和下面这个是非常相似的
global default_L = []
def f(L = default_L): pass
你可以看到,每次调用这个函数时,使用的都是同一个列表对象。