python函数默认参数作用域
2018-08-30 16:55
513 查看
当def函数参数默认值为对象时,例如列表[],字典{}
示例1:猜测一下,会输出什么???
def ddd(a,b=[]): b.append(a) return b print(ddd(1)) print(ddd(2,['a','b','c'])) print(ddd(3))
[1] ['a','b','c','2'] [3] ?????你是否认为是这样? 输出一下看看
输出结果:
D:\Python27\python.exe D:/untitled1/temp5.py [1] ['a', 'b', 'c', 2] [1, 3]
看到以上结果有什么想法,为什么呢???[1, 3]而不是[3],那么修改一下代码,输出b变量的内存地址看一下。我想,可以找到我要的答案
def ddd(a,b=[]): b.append(a) print(id(b)) #查看内存地址 return b print(ddd(1)) print(ddd(2,['a','b','c'])) print(ddd(3))
输出结果:
D:\Python27\python.exe D:/untitled1/temp5.py 170580872 [1] 171586568 ['a', 'b', 'c', 2] 170580872 [1, 3]
从输出中,可以看出,除了,第二个print,其它两个内存是一们的。那么考虑一下为什么第二个为被改变。结果显而易见,因为第二个print改变了,b对象,重新创建了一个对象。
那么如果不想出现,每次调用,默认值对象不变的问题,可以这样改一下:
def ddd(a,b=None): if type(b).__name__!='list': b = [] b.append(a) print(id(b)) #查看内存地址 return b print(ddd(1)) print(ddd(2,['a','b','c'])) print(ddd(3))
初始值设置为None,通过类型判断来,进行内处理
小结:
1.python定义def的时候,如果参数做为对象,那么,如果没有改变这个对象的前提下,那么即使,多次调用该函数也,不会创建新的对象。
那么就会出现多次调用函数,有可能都进行了处理。
2.如果,没有特殊需求,函数参数,尽量不采用对象,如果一有需要,对象进行内处理。传默认值None
相关文章推荐
- python中函数默认参数的陷阱(《改善python程序的91个建议》)
- python 笔记 之 函数中默认参数的影响
- Python函数的默认参数和返回值的简单示例
- Python 函数默认参数不能使用可变对象,如List,dict
- 关于python 的函数默认参数与关键字keyword的想法
- python 函数默认参数的小坑
- [Python]默认函数参数注意点
- Python函数参数传递以及变量作用域
- 关于Python中函数默认参数的研究
- A Byte of Python 笔记(5)函数:定义、形参、局部变量、默认参数、关键参数
- python学习笔记11(函数二): 参数的传递、变量的作用域
- Python进阶-函数默认参数(详解)
- python核心编程-默认函数对象参数
- python 零散记录(六) callable 函数参数 作用域 递归
- python函数--默认参数指向不可变对象
- python-在定义函数时,不定长参数中,默认值参数不能放在必选参数前面
- 深入解析Python中函数的参数与作用域
- 关于python函数的默认参数,可变参数,关键字参数
- 详细介绍Python函数中的默认参数
- python中函数的默认参数为list时出现异常分析