python 默认参数潜在的问题

请先看下面的代码

import time
def fun(t = time.time()):
            print(t)
fun()
fun()

以下是输出结果

1525179319.4658368
1525179319.4658368

我们所期望的是当我们多次掉用fun()的时候能够打印出不同的时间,可是实际的情况却是每次所打印的值都是一样的.


在看下面的例子

def appendtest(newitem, lista = []):
    lista.append(newitem)
    return lista

print(appendtest('a'))
print(appendtest('abc'))

以下是输出结果

['a']
['a', 'abc']

结果并不是我们所期望的结果应该是['a']['abc'],就上面两种情况,我们来分析一下原因.


  def 在python中是一个可执行的语句,当解释器执行def的时候,默认参数也会被计算并存在函数的.func_defaults属性中,由于python中函数参数传递的是对象,可变对象在调用者和被调用者之间是共享的,因此当首次调用appendtest()的时候列表lista的值变为[“a”],而在此调用的时候由于默认参数不会重新计算,所以在原先的列表上面又追加了一个['abc']元素,此时列表lista就变成了['a', 'abc'],关于第一个例子的原因和上面所说的是一样的.


上面两个例子的改正方法:

import time
def fun(t=time.time):
    print(t())

def fun_1(a, lists=None):
    if lists is None:
        lists = list()
    print(lists.append(a))

在这里推荐大家定义默认参数时,使用None或者不可变类型的参数来占位就不会出现上次与期望结果不符的输出了.


本文到此结束,谢谢大家能耐心的将它读完,如有不足之处还请不吝赐教.

原文地址:https://www.cnblogs.com/fanlei5458/p/9235479.html