Python默认params混乱

时间:2017-04-17 18:28:07

标签: python

我刚开始学习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; ?我知道上面的代码有效,但不能围绕这个“初始化的一次”描述。

3 个答案:

答案 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将成为Noneappend_to(1)并且仅当toNone时,您的代码才会重新绑定本地名称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;在电话之间。