理解python中可变对象作为默认参数
2012-11-02 09:45
288 查看
这里所说的可变对象一般是指list,dict等,首先看现象:
在每执行一次function函数,list就会增加一个值1,这是为什么呢?
通过 id(function.func_defaults[0])可以看出,每次调用完之后,其地址都未变。默认参数只在执行def语句的时候才被计算,即只在定义的时候发生。并且绑定到function上了,所以每次调用,可变参数都在原来的基础上进行操作,下面很好证明了在定义时调用:注意a.execute的调用:
复制代码
怎么避免这种情况呢?使用None作为占位符,如下:
>>> 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]
相关文章推荐
- 理解python中可变对象作为默认参数
- python--可变对象作为默认参数
- Python陷阱:为什么不能用可变对象作为默认参数的值
- Python中的可变,不可变对象;值类型,引用类型;浅拷贝,深拷贝理解
- python的raw_input()函数。 函数的可变对象和不可变对象作为参数传递。
- python坑:可变对象作为函数默认值
- Python陷阱:为什么不能用可变对象作为函数的默认参数值
- Python陷阱:为什么不能用可变对象作为函数的默认参数值
- python函数的参数(默认参数、可变参数、关键字参数和参数组合)
- Python 类与对象简单理解及总结
- python 函数的四种参数---必选参数、默认参数、可变参数和关键字参数
- 学习Python中关于默认参数的理解
- python知识点:可变对象和不可变对象
- python 引用和对象理解
- 关于Python参数传递时,传递可变对象(mutable)和不可变更对象(immutable)的误区
- python可变对象和不可变对象
- Python中的可变对象和不可变对象传递
- python引用在函数传参时的体现以及可变与不可变对象的对比
- python使用变量作为默认参数时所遇到的奇怪问题
- python--函数(必选参数、默认参数、可变参数、关键字参数)