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只能创建一次。

链接地址: http://www.djcxy.com/p/28607.html

上一篇: What is the scope of a defaulted parameter in Python?

下一篇: Local variables in Python nested functions