随后在python中调用函数的参数

时间:2013-07-17 14:54:16

标签: python function arguments

嗨,我是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]

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参数。因此,对函数的每次调用都在同一个列表上运行,这就是为什么每次都给出不同的输出。

在第二个函数中,每次调用函数时都会创建一个空列表,因此它可以按预期工作。