我的独立博客——不沉之月

Python函数默认参数的一个小陷阱

代码
def foo(a1, args = []):
    
print "args before = %s" % (args)
    args.insert(0, 
10)
    args.insert(0, 
99999)
    
print "args = %s " % (args)

def main():
    foo(
'a')
    foo(
'b')

if __name__ == "__main__":
    main()

 

以上小程序会有如下输出:

 

args before = []
args 
= [9999910
args before 
= [9999910]
args 
= [99999109999910

 

 

按照通常的理解,第二次调用的args应该为默认值[],但为什么会变成上一次的结果呢?

查阅Python manual有如下的说法:

Default parameter values are evaluated when the function definition is executed. This means that the expression is evaluated once, when the function is defined, and that that same “pre-computed” value is used for each call. This is especially important to understand when a default parameter is a mutable object, such as a list or a dictionary: if the function modifies the object (e.g. by appending an item to a list), the default value is in effect modified. This is generally not what was intended. A way around this is to use None as the default, and explicitly test for it in the body of the function, e.g.:

 

def whats_on_the_telly(penguin=None):
    
if penguin is None:
        penguin 
= []
    penguin.append(
"property of the zoo")
    
return penguin

 

 

至此,原因已经很清楚了:函数中的参数默认值是一个可变的list, 函数体内修改了原来的默认值,而python会将修改后的值一直保留,并作为下次函数调用时的参数默认值

 

posted on 2010-01-25 12:39  vls  阅读(4705)  评论(1编辑  收藏  举报