Python中的默认参数的范围是什么?
当你用一个数组参数在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]
我不太确定,如果我明白这里发生了什么。 这是否意味着数组的作用域在函数之外? 为什么数组会记住呼叫时的值? 来自其他语言,只要变量是静态的,我就会期待这种行为。 否则,似乎应该每次都重置。 实际上,当我尝试以下内容时:
def f(a):
L = []
L.append(a)
return L
我得到了我期望的行为(数组在每次调用时都被重置)。
所以在我看来,我只需要def f(a, L=[]):
解释 - L
变量的范围是什么?
范围如你所期望的那样。
可能令人惊讶的是默认值只计算一次并重用,所以每次调用函数时都会得到相同的列表,而不是初始化为[]的新列表。
该列表存储在f.func_defaults
。
def f(a, L=[]):
L.append(a)
return L
print f(1)
print f(2)
print f(3)
print f.func_defaults
f.func_defaults = (['foo'],) # Don't do this!
print f(4)
结果:
[1]
[1, 2]
[1, 2, 3]
([1, 2, 3],)
['foo', 4]
L
变量的作用域就像你期望的那样。
这个问题与你用[]
创建的列表有关。 每次调用函数时,Python都不会创建一个新列表。 每次你打电话时, L
被分配相同的列表,这就是为什么该功能“记住”以前的呼叫。
所以实际上这就是你所拥有的:
mylist = []
def f(a, L=mylist):
L.append(a)
return L
Python教程就是这样说的:
默认值只计算一次。 当默认值是可变对象(如列表,字典或大多数类的实例)时,这会有所不同。
并提出以下方法来编码预期的行为:
def f(a, L=None):
if L is None:
L = []
L.append(a)
return L
比你想象的还要少的“魔力”。 这相当于
m = []
def f(a, L=m):
L.append(a)
return L
print f(1)
print f(2)
print f(3)
m
只能创建一次。