嗨,我是python的新手。有人可以解释下面两段代码如何给出不同的输出?每次调用函数时都会定义函数吗?
def f(a, L=[]):
L.append(a)
return L
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, 2, 3]
[1]
[2]
[3]
答案 0 :(得分:2)
对于新的python开发人员来说,这是一个非常常见的'问题'。在第一个示例中,看起来像,就像每次调用函数时都应该创建一个新的空列表而没有第二个参数。事实并非如此。创建函数对象时创建单个列表 ,这基本上是在加载python脚本或在交互式shell中完成函数输入时。然后该列表用于函数的每次调用,因此您看到的是acculmation。
第二种是循环使用它的标准方法,每次调用函数时都会创建一个新的列表实例而没有第二个参数。
在幕后,Python将它在函数定义中找到的任何默认值放入名为 defaults 的函数的属性中。您可以看到交互式shell中的调用之间是如何存在相同的实例的:
>>> def f(a,b=[]):
... b.append(a)
>>> f.__defaults__
([],)
>>> f(1)
>>> f.__defaults__
([1],)
>>> f(2)
>>> f.__defaults__
([1,2],)
答案 1 :(得分:0)
python中的默认参数在函数声明点进行计算 - 当它首次被解释器看到时。
在您的第一个代码段中,L
参数被“赋予”一个列表作为默认值,因此会附加值。
在第二个代码段中,L
在进入函数时始终为None
,因此每次都会重新创建。
答案 2 :(得分:0)
定义函数时,将评估函数默认参数。
在您的情况下,def f(a, L=[]):
创建一个空列表,然后在每次调用函数时都传递该列表,而不使用L
参数。因此,对函数的每次调用都在同一个列表上运行,这就是为什么每次都给出不同的输出。
在第二个函数中,每次调用函数时都会创建一个空列表,因此它可以按预期工作。