Python中的函数默认参数 - Ryan_Liu

python

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

回到顶部