This question already has answers here:
“Least Astonishment” and the Mutable Default Argument
(32个答案)
在11个月前关闭。
我阅读了以下教程:
https://docs.python.org/3/tutorial/controlflow.html#default-argument-values
并做一些实验。
我发现默认参数非常令人困惑。谁能解释以下现象?
首先,我尝试了以下代码:
结果是:
根据该文档,这是因为默认参数L是可变的,并且在定义函数时,其值将仅被评估一次。这看起来不错!
但是,我接下来尝试了代码2:
结果是:
为了研究默认参数,我改进了代码2并尝试了代码3:
结果是:
这表明在if语句之前的L始终为None,并且具有与if语句中的L的id不同的id,前者的id是固定的,而后者在每次运行中都会更改。
我还尝试了以下代码:
结果是:
这表明L_r与if语句中的L具有相同的ID。
您能解释一下if语句和if语句之外的L之间的区别以及为什么吗?
谢谢!
默认参数
希望对您有所帮助,如有其他问题,请发表评论。 :)
(32个答案)
在11个月前关闭。
我阅读了以下教程:
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,并且具有与if语句中的L的id不同的id,前者的id是固定的,而后者在每次运行中都会更改。
我还尝试了以下代码:
L_r = f(5)
print(id(L_r))
结果是:
<class 'NoneType'>
4381397320
None
4385607496
4385607496
这表明L_r与if语句中的L具有相同的ID。
您能解释一下if语句和if语句之外的L之间的区别以及为什么吗?
谢谢!
最佳答案
如果不给出L
,则默认参数将创建一个变量L
,并将其重用于多次调用,因此在代码1中,将在同一L
中对其进行编辑。
但是在代码2中,您可以在函数中更改L
:
if L is None:
L = []
默认参数
L=None
始终与代码1相同(id = 4381397320
),但是此语句使L
引用新变量,因此id
将有所不同,并且结果将不会累加。希望对您有所帮助,如有其他问题,请发表评论。 :)
关于python - python函数中默认参数的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55644060/
10-13 07:47