python函数中默认参数的值

时间:2019-04-12 03:26:19

标签: python arguments

我阅读了以下教程:

https://docs.python.org/3/tutorial/controlflow.html#default-argument-values

做一些实验。

我发现默认参数非常混乱。谁能解释以下现象?

首先,我尝试了以下代码:

Code 1

def f(a, L=[]):
    L.append(a)
    return L

print(f(1))
print(f(2))
print(f(3))

结果是:

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

根据文档,这是因为默认参数L是可变的,并且在定义函数时,其值将仅被评估一次。看起来不错!

但是,我接下来尝试了代码2:

Code 2

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]

要研究默认参数,我改进了代码2并尝试了代码3:

Code 3

def f(a, L=None):
    print(type(L))
    print(id(L))
    print(L)

    if L is None:
        L = []
        print(id(L))

    L.append(a)
    return L

print(f(1))
print(f(2))
print(f(3))

结果是:

<class 'NoneType'>
4381397320
None
4385607368
[1]

<class 'NoneType'>
4381397320
None
4385607496
[2]

<class 'NoneType'>
4381397320
None
4386251464
[3]

这表明if语句之前的L始终为None,并且其id与if语句中的L的ID不同,并且前者的ID是固定的,而后者在每次运行中都会更改。

我还尝试了以下代码:

L_r = f(5)
print(id(L_r))

结果是:

<class 'NoneType'>
4381397320
None
4385607496
4385607496

这表明L_r与if语句中的L具有相同的ID。

您能解释一下if语句之外和if语句中的L之间的区别是什么吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

如果您不提供L,则默认参数将创建一个变量L,并将其重用于多次调用,因此在代码1 中对其进行了编辑在同一L中。

但是在代码2 中,您在函数中更改了L

if L is None:
   L = []

默认参数L=None始终与代码1 相同(id = 4381397320),但是此语句使L引用了一个新变量,因此id将有所不同,并且结果将不会累加。

希望对您有所帮助,如果还有其他问题,请发表评论。 :)