我刚开始学习Python,我对这个例子感到困惑:
def append_to(element, to=None):
if to is None:
to = []
to.append(element)
return to
Run Code Online (Sandbox Code Playgroud)
如果to被初始化一次,也不会to没有None的第二次它叫什么名字?我知道上面的代码有效,但无法解决这个"初始化一次"的描述.
如果“to”被初始化一次,那么“to”在第二次调用时不会是“None”吗?
toNone如果您不为其传递值,则会变成:append_to(1)并且只有当to您None的代码将本地名称重新绑定to到函数体内新创建的列表时:to = []。
函数的默认值仅分配一次,即您分配为默认值的任何内容,该对象将用于您对函数进行的每次调用,并且不会更改,通常每次调用都会使用默认值的相同引用调用您对该函数进行的操作。当您将可变值分配为默认值时,这一点很重要:
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
Run Code Online (Sandbox Code Playgroud)
多次运行上述函数,您将观察到列表随着更多元素而增长,因为对于每个函数调用共享的每个函数,您仅获得一份参数默认值的副本。但请注意这里:
def localVars(d=None):
if d is None:
d = [] # Different list for every call when d is None
Run Code Online (Sandbox Code Playgroud)
d = []每次调用时都会执行localVars;当函数完成其工作时,当引用计数降至 0 时,每个局部变量都会被垃圾收集,但参数的默认值不会被垃圾收集,它们在函数执行后存在,并且通常不会在函数执行后被垃圾收集。