Python默认params混乱

前端之家收集整理的这篇文章主要介绍了Python默认params混乱前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我刚开始学习Python,我对这个例子感到困惑:

def append_to(element,to=None):
    if to is None:
        to = []
    to.append(element)
    return to

如果要初始化一次,第二次调用时不会不是None吗?我知道上面的代码有效,但无法解决这个“初始化一次”的描述.

最佳答案

If “to” was initialized once,wouldn’t “to” won’t be “None” the 2nd time it’s called?

如果您没有为它传递值,则将变为None:append_to(1)并且仅当to为None时,您的代码才会将本地名称重新绑定到函数体内新创建的列表:to = [].

函数的默认值只分配一次,即您指定为默认值的任何内容,该对象将用于您对函数进行的每次调用,并且不会更改,通常每次使用相同的默认值引用打电话给你做功能.将mutable分配为默认值时,这很重要:

l = [] 
def defArgs(d=l)            # default arguments,same default list for every call
    d.append(1)
    return d 

defArgs() is l            # Object identity test: True

多次运行上面的函数,您将观察到列表越来越多,因为每个函数调用共享的每个函数只能获得一个参数默认值的副本.但请注意:

def localVars(d=None):
    if d is None: 
        d = []               # Different list for every call when d is None

每次调用localVars时都会执行d = [];当函数完成其工作时,每个局部变量在引用计数降为0时被垃圾收集,但不是参数的默认值,它们在执行函数后生存,并且在执行函数后通常不进行垃圾收集.

猜你在找的Python相关文章