2011-09-28 59 views
1

可能重复:
“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是一个局部变量,我想输出应该是:

[1] 
[2] 
[3] 

我尝试另一种方式来实现这个功能: 代码:

def f(a, L=None): 
    if L is None: 
    L = [] 
    L.append(a) 
    return L 

这一次,输出为:

[1] 
[2] 
[3] 

我只是不明白为什么... 有没有人有一些想法?非常感谢。

+4

阅读此http://effbot.org/zone/default-values.htm – spicavigo

回答

3

的默认参数实际上定义函数时初始化,因此

def f(L = []): pass 

颇为相似

global default_L = [] 
def f(L = default_L): pass 

你可以看到这个方式,它是同一个列表对象用于函数的每个调用中。

2

def f(a, L=[])中的列表被定义为函数被定义。每次您在没有关键字参数的情况下调用该函数时都是相同的列表。

将关键字设置为None并按照您的操作进行检查/创建是此类行为的常用工作。

相关问题