在执行def语句时,默认参数的值只被解析并保存一次,而不是每次在调用函数的时候。这通常是你想要的那样,但是因为默认值需要在每次调用时都保持同样对象,你在试图改变可变的默认值(mutable defaults)的时候可要小心了。例如,下面的函数中使用一个空的列表作为默认值,然后在之后每一次函数调用的时候改变它的值:
|
1
2
3
4
5
6
7
8
9
10
11
12
|
>>> def saver(x=[]): # 保存一个列表对象... x.append(1) # 并每次调用的时候... print x # 改变它的值...>>> saver([2]) # 未使用默认值[2, 1]>>> saver() # 使用默认值[1]>>> saver() # 每次调用都会增加![1, 1]>>> saver()[1, 1, 1] |
有的人将这个视作Python的一个特点——因为可变的默认参数在每次函数调用时保持了它们的状态,它们能提供像C语言中静态本地函数变量的类似的一些功能。但是,当你第一次碰到它时会觉得这很奇怪,并且在Python中有更加简单的办法来在不同的调用之间保存状态(比如说类)。
要摆脱这样的行为,在函数开始的地方用切片或者方法来创建默认参数的副本,或者将默认值的表达式移到函数里面;只要每次函数调用时这些值在函数里,就会每次都得到一个新的对象:
|
1
2
3
4
5
6
7
8
9
10
11
|
>>> def saver(x=None):... if x is None: x = [] # 没有传入参数?... x.append(1) # 改变新的列表... print x...>>> saver([2]) # 没有使用默认值[2, 1]>>> saver() # 这次不会变了[1]>>> saver()[1] |
原文:http://www.cnblogs.com/briller/p/4244181.html