week04_python函数缺省值
2018-09-13 19:01
337 查看
默认值的作用域
因为函数也是对象,python把函数的默认值放在了属性中,这个属性就伴随着这个函数对象的整个生命周期;
查看foo.__defaults__属性;
xyz默认值是引用类型,引用类型的元素变动,并不是元组的变化;
可变类型默认值,如果使用默认值,就可能修改这个默认值;
有时候这个特性是好的,有的时候这种特性是不好的,有副作用;
如何做到按需改变呢?看如下两种方法:
xyz都是传入参数或默认参数的副本,如果就想修改原参数,无能为力;
如果使用缺省值None就创建一个列表;
如果传入一个列表,就修改这个列表;
总结:
第一种方法,使用影子拷贝创建一个新的对象,永远不能改变传入的参数
第二种方法,
通过值的判断就可以灵活的选择创建或者修改传入对象;
这种方式灵活,应用广泛;
很多函数的定义,都可以看到使用None这个不可变的值作为默认参数,可说这是一种惯法。
def foo(xyz=[]): xyz.append(10) print(xyz) foo()#[10] foo()#[10, 10]为什么第二次调用foo函数打印的是[10, 10]???
因为函数也是对象,python把函数的默认值放在了属性中,这个属性就伴随着这个函数对象的整个生命周期;
查看foo.__defaults__属性;
def foo(xyz=[], u='abc', z=123): xyz.append(1) return xyz print(foo(), id(foo))#[1] 12588984 print(foo.__defaults__)#([1], 'abc', 123) print(foo(), id(foo))#[1, 1] 12588984 print(foo.__defaults__)#([1, 1], 'abc', 123)函数地址并没有变,就是说函数这个对象的没有变,调用它,它的属性__defaults__中使用元组保存所有默认值;
xyz默认值是引用类型,引用类型的元素变动,并不是元组的变化;
非引用类型的例子: def foo(w, u='abc', z=123): u = 'xyz' z = 789 print(w, u, z) print(foo.__defaults__)#('abc', 123) foo('magedu')#magedu xyz 789 print(foo.__defaults__)#('abc', 123)属性__defaults__中使用元组保存所有默认值,它不会因为在函数体内使用了它而发生改变。
可变类型默认值,如果使用默认值,就可能修改这个默认值;
有时候这个特性是好的,有的时候这种特性是不好的,有副作用;
如何做到按需改变呢?看如下两种方法:
def foo(xyz=[], u='abc', z=123): xyz = xyz[:]#影子拷贝 xyz.append(1) print(xyz) print(foo.__defaults__) foo() print(foo.__defaults__) foo() print(foo.__defaults__) foo([10]) print(foo.__defaults__) foo([10, 5]) print(foo.__defaults__)函数体内,不改变默认值:
xyz都是传入参数或默认参数的副本,如果就想修改原参数,无能为力;
def foo(xyz=None, u='abc', z=123): if xyz is None: xyz = [] xyz.append(1) print(xyz) foo() print(foo.__defaults__) foo() print(foo.__defaults__) foo([10]) print(foo.__defaults__) foo([10, 5]) print(foo.__defaults__)使用不可变类型默认值:
如果使用缺省值None就创建一个列表;
如果传入一个列表,就修改这个列表;
总结:
第一种方法,使用影子拷贝创建一个新的对象,永远不能改变传入的参数
第二种方法,
通过值的判断就可以灵活的选择创建或者修改传入对象;
这种方式灵活,应用广泛;
很多函数的定义,都可以看到使用None这个不可变的值作为默认参数,可说这是一种惯法。
相关文章推荐
- python函数缺省值与引用学习笔记分享
- python函数缺省值与引用学习笔记分享
- week04_python函数的销毁
- week04_python函数返回值、作用域
- python中的函数对象与闭包函数
- python内建函数a-b部分(一)
- python的enumerate()函数
- python引用下标或者使用range函数时时注意事项
- 12-python_函数-Lambda
- Xman整理篇___关于Python的一些基础方法及函数
- python函数传递list,tuple和dict时的复制关系
- Python 将 tuples 作为参数依序传入函数 (Expanding tuples into arguments)
- Python之学习笔记(函数)
- 6 Python中的format()函数
- Python,函数(1)
- Python 函数相关总结
- python函数参数中*args,**kwargs的使用和意义
- python 文件和路径操作函数小结
- [学习笔记]Python 常用函数
- Python 内建函数 - vars([object])