python3的默认参数

  • 2018-08-11
  • 0
  • 0

作者信息:

Author : 黄志成(小黄)

博客地址: 博客

什么是默认参数?

默认参数指的是当函数调用中省略了实参时自动使用的一个值.

def foo(a = 1):
    print(a)

foo() # 结果是 打印出 1
foo(5) # 结果是 打印出 5

和其他语言都没有什么区别.但是有一个地方需要注意,很多新手都会踩坑.

def test(a=[]):
    a.append(1)
    print(a)

test()
test()
test()

结果是:

[1]
[1, 1]
[1, 1, 1]

什么情况!在其他语言中不应该是每次都是 [1] 吗?

如何解释这个问题呢。在Python中一切皆对象 函数也是对象.

我们可以使用type函数来看看.

print(type(test))

#输出:<class 'function'>

它是属于一个function类.

解释器在初始化之后,会生成函数名到函数对象的一个映射关系。可以通过函数名访问函数对象.并且函数的一切属性也确定下来,包括所需的参数,默认参数的值。

我们可以使用defaults来查看默认参数.

所有默认值都存储在函数对象的defaults属性中.

def test(a=[]):
    print(id(a))
    a.append(1)
    print(a)

test()
test()
print(test.__defaults__)

结果:

4331101704
[1]
4331101704
[1, 1]
([1, 1],)

结论就是:python会在初始化函数对象之后,将函数的默认参数存入属性.对于可变参数来说会有很大影响.对于不可变的来说就没有什么影响了。

下面这个例子更加证明了默认参数在函数初始化之后会成为函数对象的一个属性.

import datetime
from time import sleep
def test(a=datetime.datetime.now()):
    sleep(2)
    print(a)

test() #2018-08-11 18:41:55.563417
test() #2018-08-11 18:41:55.563417

两次输出的时间都为初始化时间.

那么最后如何解决这个问题呢?

import datetime
from time import sleep
def test(a=None):
    sleep(2)
    if a == None:
        a = datetime.datetime.now()
    print(a)


test() #2018-08-11 18:44:57.090312
test() #2018-08-11 18:44:59.092032

我们可以将默认值设为None来传递.然后通过判断是否为None来赋值.

好啦,问题解决了.

这样一个小问题如果没有处理好,可能会造成内存溢出.应用在web服务器中将是一个很大的隐患.

评论

还没有任何评论,你来说两句吧