300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > python 缺省参数_week04_python函数缺省值

python 缺省参数_week04_python函数缺省值

时间:2020-03-20 03:41:27

相关推荐

python 缺省参数_week04_python函数缺省值

默认值的作用域deffoo(xyz=[]):

xyz.append(10)

print(xyz)

foo()#[10]

foo()#[10,10]

为什么第二次调用foo函数打印的是[10, 10]???

因为函数也是对象,python把函数的默认值放在了属性中,这个属性就伴随着这个函数对象的整个生命周期;

查看foo.__defaults__属性;deffoo(xyz=[],u='abc',z=123):

xyz.append(1)

returnxyz

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默认值是引用类型,引用类型的元素变动,并不是元组的变化;非引用类型的例子:

deffoo(w,u='abc',z=123):

u='xyz'

z=789

print(w,u,z)

print(foo.__defaults__)#('abc',123)

foo('magedu')#mageduxyz789

print(foo.__defaults__)#('abc',123)

属性__defaults__中使用元组保存所有默认值,它不会因为在函数体内使用了它而发生改变。

可变类型默认值,如果使用默认值,就可能修改这个默认值;

有时候这个特性是好的,有的时候这种特性是不好的,有副作用;

如何做到按需改变呢?看如下两种方法:deffoo(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都是传入参数或默认参数的副本,如果就想修改原参数,无能为力;deffoo(xyz=None,u='abc',z=123):

ifxyzisNone:

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这个不可变的值作为默认参数,可说这是一种惯法。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。