为什么这个局部变量可以在函数中保持其值

时间:2011-09-28 09:58:00

标签: python

  

可能重复:
  “Least Astonishment” in Python: The Mutable Default Argument

我最近在Python中遇到了一个问题。 代码:

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

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

输出将是

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

但是为什么本地列表中的值:函数f中的L保持不变? 因为L是一个局部变量,我认为输出应该是:

[1]
[2]
[3]

我尝试了另一种实现此功能的方法: 代码:

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

这次输出是:

[1]
[2]
[3]

我只是不明白为什么...... 有没有人有想法?非常感谢。

2 个答案:

答案 0 :(得分:3)

默认参数实际上是在定义函数时初始化的,所以

def f(L = []): pass

非常相似
global default_L = []
def f(L = default_L): pass

您可以通过这种方式看到它与函数的每次调用中使用的列表对象相同。

答案 1 :(得分:2)

def f(a, L=[])中的列表定义为定义了函数。每次调用没有关键字参数的函数时,它都是相同的列表。

将关键字设置为None并按照您的方式检查/创建是这种行为的常用方法。