这里所说的可变对象一般是指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]
转载于:https://blog.51cto.com/3502990/1047843