在python中定义函数时不需要声明函数参数的返回值类型,python函数调用时所提供的参数可以是什么

  在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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: