在python中定义函数时不需要声明函数参数的返回值类型,python函数调用时所提供的参数可以是什么
请查看以下程序:
def extend_list(v,li=[]):
李追加(五)
还李
list1=extend_list(10)
list2=extend_list(123,[])
list3=extend_list(a )
打印(列表1)
打印(列表2)
打印(列表3)
Print(list1是list3)请先猜测打印的结果:
不是这样的:
[10]
[123]
[a]
错误的
然而,实际的印刷效果
请看下面的解释:
!-蟒蛇-
#函数的定义相当于类型构造,默认值此时只解析一次。
#并且调用该函数时不会重新执行默认参数的构造。因此,如果使用字典,就使用列表这样的变量类型。
#而且如果要在函数体中修改,可能会有意想不到的效果。
def a(b=[]):
b.append(“嗨”)
打印b
在[11]中:a()
[嗨]
在[12]中:a()
[嗨,嗨]
在[13]中:a([2])
[2 ,嗨]
在[14]中:a()
[嗨,嗨,嗨]
In [15]: a.func_defaults
Out[15]: ([嗨,嗨,)
#解决方法:使用None指定参数的默认值。
def(b=无):
b=b或[]
及格
#类属性也有类似问题。
A类(对象):
x=[]
def __init__(self,c):
Self.x.append(c) #这里的X搜索的是类级别的X,而不是实例,
#因为实例级的X不是预先定义的
在[36]中:a1,a2=A(1),A(2)
在[37]中:a1.x,a2.x
Out[37]: ([1,2],[1,2])
#解决方法,预先定义实例级属性。
B类(对象):
x=[]
def __init__(self,c):
Self.x=[] #这里的实例属性有X,所以先在这里搜索。
self.x .追加(c)
在[38]中:b1,b2=B(1),B(2)
在[39]中:b1.x、b2.x
Out[39]: ([1],[2])
Python可变对象作为默认参数trap可变对象和不可变对象在python中,一切都是对象。python中没有所谓的传值调用。传递的只是对象的引用,也可以认为是地址。
在python中,对象可以分为可变和不可变类型。
Tuple、number和string是不可变对象,而dictionary和list对象是可变对象。
对于可变对象,地址可以改变原始对象的值。对于不可变对象,地址相当于添加一个指向值的指针(不可变)。
不可变对象
可变对象
函数默认参数捕获以下过程。
#!/usr/bin/env python
# -*-编码:utf-8 -*-
课程演示_列表:
def __init__(self,l=[]):
self.l=l
定义添加(自身,元素):
self.l.append(元素)
定义附加器(ele):
obj=demo_list()
添加(元素)
打印对象
if __name__==__main__ :
对于范围(5)中的I:
附录(一)
产量是多少?
[0]
[0, 1]
[0, 1, 2]
[0, 1, 2, 3]
[0,1,2,3,4]而不是想象
[0]
[1]
[2]
[3]
[4]而如果想达到第二种效果,只需将obj=demo_list()改为obj=demo_list(l=[])。
默认原则的官方文件中的一句话:
默认值计算一次,然后重新使用。
重新使用默认值。
默认参数值为eval(238,238,238);不透明度:0.6;
Python中的函数是一级对象,而不仅仅是一段代码。
我们可以这样理解:函数也是对象,所以定义了就执行了。默认参数是函数的属性,其值可能会随着函数的调用而改变。其他物体不都是这样的吗?
避免使用变量参数作为默认值,这可能会导致意外的行为。为了防止这种情况,最好使用后跟校验码的None值。
def __init__(self,l=None):
如果不是l:
self.l=[]
否则:
self.l=l
这里用None作为占位符来控制参数l的默认值,但是有时候参数值可能是任意对象(包括None),那么None就不能作为占位符。您可以将对象定义为占位符,如下例所示:
sentinel=object()
def func(var=sentinel):
如果var是sentinel:
及格
否则:
打印变量
Decorator方法Python cookbook也提到了这个方法。为了避免对每个函数中可能不存在的每个对象做出if not l判断,使用了一种更优雅的修饰方法。
导入副本
def freshdefault(f):
fdefaults=f.func_defaults
定义刷新程序(*args,**kwds):
f . func _ defaults=deepcopy(fdefaults)
返回f(*args,**kwds)
返回刷新
这段代码还再次验证了默认参数是函数的一个属性这一事实。
python中函数的默认值只会执行一次(和静态变量一样,静态变量的初始化也是执行一次)。Python可以通过函数的默认值实现静态变量的功能。
参考[1]陷阱!Python参数默认值
[2]python提示——注意函数参数的默认值
[3]Python中的默认参数值
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。