我刚开始学习Python,我对这个例子感到困惑:
def append_to(element, to=None):
if to is None:
to = []
to.append(element)
return to
如果to
初始化一次,第二次调用to
时不会None
SELECT bookingid
, customerid
, flightid
, numseats
, passengerid
, firstname
, surname
, passportno
, nationality
, dobdate
FROM flightbooking, passenger;
?我知道上面的代码有效,但不能围绕这个“初始化的一次”描述。
答案 0 :(得分:2)
def append_to(element, to=None):
to = ...
to
此处成为本地变量并分配给列表,如果您不将返回值分配给另一个变量,则会取消分配。
如果您希望to
保持活跃状态以便随后调用append_to
,您应该这样做:
def append_to(element, to=[]):
to.append(element)
return to
<强>演示:强>
>>> lst = append_to(5)
>>> append_to(6)
>>> append_to(7)
>>> print lst
[5, 6, 7]
答案 1 :(得分:1)
如果您没有为其传递值,则如果“to”初始化一次,第二次调用“to”不会是“None”吗?
to
将成为None
:append_to(1)
并且仅当to
为None
时,您的代码才会重新绑定本地名称to
到函数正文中新创建的列表: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
每次拨打d = []
时都会执行{p> localVars
;当函数完成其工作时,每个局部变量在引用计数降为0,但不是参数的默认值时进行垃圾收集,它们在执行函数后生效,并且在执行后通常不进行垃圾收集功能。
答案 2 :(得分:0)
在Python中,使用变量时没有声明和初始化阶段。相反,所有赋值都是将实例绑定到变量名称的定义。
解释器在实例化函数时将实例绑定到默认值。当默认值是一个可变对象而你只用它的方法改变它的状态时,它的值将是&#34; shared&#34;在电话之间。