默认参数为空列表
def appendtest (newitem, lista =[]):
    print (id(lista))
    lista.append (newitem)
    print (id(lista))
    return lista
appendtest("a", ['b',2, 4, [1,2]])
140229078010176 140229078010176
['b', 2, 4, [1, 2], 'a']
现在请读者思考这么一个问题:如果第二个参数采取默认参数,
连续调用两次 appendtest(1) , appendtest('a') ,函数的返回值是多少?
期望的结果应该是[1]和['a'],对吧? 可是实际情况却输出了 [1]和[1,'a']那么这是什么原因呢?
def在Python中是一个可执行的语句,当解释器执行def的时候,默认参数也会被计算,
并存在函数的.func_defaults属性中,由于Python中闲数参数传递的是对象,
可变对象在调用者和被调用者之间共享,因此当首次调用 appendtest(1) 的时候,
[]变为[1],而再次调用的时候由于默认参数不会重新计算,在[1]的基础上便变为了 [1,'a']。
可以通过査看函数的 ftinc_defaults 来确认这一点。
appendtest(1)
140229077958400 140229077958400
[1]
appendtest ('a')
140229077958400 140229077958400
[1, 'a']
appendtest. func_defaults
([1, 'a'])
appendtest. fimc_def aults [of I:]=[]
appendtest. func_defaults
([],)如果不想让默认参数所指向的对象在所有的函数调用中被共享,而是在函数调用的过程中动态生成,
可以在定义的时候使用 None 对象作为占位符。因此本节幵头的例子应该修正为如下形式:
R 认参数改为 None ...
def appendtest (newitem, lista=None) :
    if lista is None:
        lista = []
    lista.append (newitem)
    return lista
最后以一个问题结束本节:假设 report() 函数需要传入当前系统的时间并做一些处理,
下面两种参数传递方式哪神正确呢?读者应该知道答案了!
import time
def report(when = time.time()):
    pass
def report (when = time.time()):
    pass