Python中的函数默认参数 - Ryan_Liu
Python中的函数默认参数
2014-01-17 21:23
Ryan_Liu
阅读(6912)
评论(1)
编辑
收藏
举报
今天想编写个Trie树的小东西,没想到居然遇到python中的一个很知名的坑,看似没毛病的代码,就是得不到正确结果,最后在stackoverflow上才寻得大牛解释。故记录如下。
大致是这样一个问题
def fun(a=[]):a.append(1)
print a
#执行3次fun() 预料结果应该是[1] [1] [1] 实际结果如下
fun() #[1]
fun() #[1,1]
fun() #[1,1,1]
...
这个问题叫做default mutable parameter values,为何会发生这样的结果呢?
不急,举个简单的例子
def fun1(a):
a.append(1)
print a
b = []
fun1(b) #[1]
fun1(b) #[1,1]
fun1(b) #[1,1,1]
这个结果应该再清楚不过吧,回到最前面的问题,你可以简单的理解[]就是全局作用域中的一个对象。
详细说明如下:
在python中,函数是一等公民,这种编程泛型叫做函数式编程。这里不说函数,说function可能更好一些。
def一个function,是一个执行语句。其目的是把一个当前环境function的名字和一个function对象绑定起来。这个function对象包括一个对function的引用,也就是说通过这个function对象可以调用function。function的body是不会执行的,只有在function被调用时才会执行。
那么默认函数参数呢?
Default parameter values are evaluated when the function definition is executed.
也就是说默认函数参数是在写def时就已经被赋值(引用)了!
这样你可以把默认参数理解成function对象的一个类似于\'member variable\'之类的东西来对待!!
这也就是说如果默认参数是可变的,如果function改变了这个参数(append or something else),那么这个参数就会改变的!
再看个小例子
b = []
def fun(a=b): #在执行这个def时已经把a绑定到b了
a.append(1)
..
这下子是不是有种明朗的感觉?
如何消除这个问题呢,一种方法如下
def fun(a=None):
if a == None:
a=[]
...
这样每个a就是独立的了。
以上是 Python中的函数默认参数 - Ryan_Liu 的全部内容, 来源链接: utcz.com/z/387462.html