我对Python3.6

时间:2018-05-24 12:14:06

标签: python arguments

以下是两段符合python3.6标准的代码。它们是python3.6(教程,第25页)文档中的示例。 第一个是:

def f(a, L=[]):
    L.append(a)
    return L
print(f(1))
print(f(2))
print(f(3))

结果:

[1]
[1, 2]
[1, 2, 3]

第二个:

def f(a, L = None):
    if L is None:
        L = []
    L.append(a)
    return L
print(f(1))
print(f(2))
print(f(3))

结果:

[1]
[2]
[3]

所以,在第二段代码中,我感到困惑的是,在print(f(1))执行后,print(f(2))会将a = 2L=[1]传递给f() ,但为什么f()没有得到L=[1]? 如果第二段代码中的L = None在每次调用L时定义Nonef(),而在第一段代码中为什么L = []不要将L定义为[]

1 个答案:

答案 0 :(得分:0)

这两个例子展示了默认参数如何在幕后工作: 第一个论述了默认论点' live'在函数定义中。含义:如果用def部分覆盖整个函数,则只会重置第一个函数中L的值。

对于第二个实现也是如此BUT因为它是None:你必须在执行函数体时初始化它。每次调用函数时,这都会产生一个新的列表。

这种行为可能令人困惑并导致奇怪的结果,这就是为什么我从大多数消息来源获悉最好避免使用第一个选项并使用None默认args。

希望我能稍微清楚一点。