python函数中默认参数的值

python函数中默认参数的值,python,arguments,Python,Arguments,我阅读了以下教程: 做一些实验 我发现默认参数非常混乱。有人能解释以下现象吗 首先,我尝试了以下代码: Code 1 def f(a, L=[]): L.append(a) return L print(f(1)) print(f(2)) print(f(3)) L_r = f(5) print(id(L_r)) 结果是: [1] [1, 2] [1, 3, 3] [1] [2] [3] <class 'NoneType'> 4381397320 Non

我阅读了以下教程:

做一些实验

我发现默认参数非常混乱。有人能解释以下现象吗

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

Code 1

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

print(f(1))
print(f(2))
print(f(3))
L_r = f(5)
print(id(L_r))
结果是:

[1]
[1, 2]
[1, 3, 3]
[1]
[2]
[3]
<class 'NoneType'>
4381397320
None
4385607368
[1]

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

<class 'NoneType'>
4381397320
None
4386251464
[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]
[1, 2]
[1, 3, 3]
[1]
[2]
[3]
<class 'NoneType'>
4381397320
None
4385607368
[1]

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

<class 'NoneType'>
4381397320
None
4386251464
[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))
结果是:

[1]
[1, 2]
[1, 3, 3]
[1]
[2]
[3]
<class 'NoneType'>
4381397320
None
4385607368
[1]

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

<class 'NoneType'>
4381397320
None
4386251464
[3]
结果是:

<class 'NoneType'>
4381397320
None
4385607496
4385607496

4381397320
没有一个
4385607496
4385607496
这表明L_r与if语句中的L具有相同的id

你能解释一下if语句外的L和if语句内的L有什么区别吗?为什么


谢谢大家!

如果不给出
L
,默认参数将创建一个变量
L
,并将其重新用于多个调用,因此在code 1中,它将在相同的
L
中编辑

但在代码2中,您可以在函数中更改L

if L is None:
   L = []
默认参数
L=None
始终与code 1相同(id=
4381397320
),但此语句使
L
引用一个新变量,因此
id
将不同,并且结果不会累加

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