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

2 投票
2 回答
1772 浏览
提问于 2025-04-17 03:15

可能重复的问题:
Python中的“最小惊讶原则”:可变默认参数

我最近在使用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 个回答

3

def f(a, L=[]) 这个函数里,列表是在函数定义的时候就创建好的。每次你调用这个函数而不提供关键字参数时,使用的都是同一个列表。

把关键字参数设置为 None,然后根据这个来检查或创建列表,就像你做的那样,是解决这种情况的常见方法。

5

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

def f(L = []): pass

和下面这个是非常相似的

global default_L = []
def f(L = default_L): pass

你可以看到,每次调用这个函数时,使用的都是同一个列表对象。

撰写回答