您的位置:首页 > 编程语言 > Python开发

理解python中可变对象作为默认参数

2012-11-02 09:45 288 查看
这里所说的可变对象一般是指list,dict等,首先看现象:

>>> def function(data = []):
... data.append(1)
... print data
... print type(data)
...
>>> function()
[1]
<type 'list'>
>>> function()
[1, 1]
<type 'list'>
>>>
>>> (function.func_defaults[0])
[1, 1]
>>> id(function.func_defaults[0])
3070981484L
>>> function()
[1, 1, 1]
<type 'list'>
>>> id(function.func_defaults[0])
3070981484L


在每执行一次function函数,list就会增加一个值1,这是为什么呢?

通过 id(function.func_defaults[0])可以看出,每次调用完之后,其地址都未变。默认参数只在执行def语句的时候才被计算,即只在定义的时候发生。并且绑定到function上了,所以每次调用,可变参数都在原来的基础上进行操作,下面很好证明了在定义时调用:注意a.execute的调用:

>>> def a():
... print "a executed"
... return []
...
>>>
>>> def b(x=a()):
... x.append(5)
... print x
...
a executed
>>> b()
[5]
>>> b()
[5, 5]

>>> def a():
... print "a executed"
... return []
...
>>>
>>> def b(x=a()):
... x.append(5)
... print x
...
a executed
>>> b()
[5]
>>> b()
[5, 5]

复制代码

怎么避免这种情况呢?使用None作为占位符,如下:

>>> def instead_function(data=None):
... if data is None:
... data = []
... data.append(1)
... print data
...
>>> instead_function()
[1]
>>> instead_function()
[1]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息