为什么python中的命名参数具有一致的内存? [重复]

问题描述 投票:1回答:1

这个问题在这里已有答案:

以下代码

def f(x,l=[]):
    for i in range(x):
        l.append(i*i)
    print(l) 

f(2)
f(3)

输出

[0, 1]

[0, 1, 0, 1, 4]

而不是琐碎的

[0, 1]

[0, 1, 4]

这意味着命名参数l实际上是一个单一的一致变量,它不会对f的新调用重置。

这显然不是一个bug,而是设计的。

我的问题是为什么这是理想的行为?对我而言似乎更有困惑而不是有用,这将使我永远不想使用不可变的默认值。

python reference pass-by-reference default-value
1个回答
0
投票

函数定义一次,因此当使用具有可变类型的默认args时,它们使用对该默认arg的单个引用(因为它再次定义一次)。这就是为什么使用列表,dicts等作为默认args而不是像None,int,str等不可变类型的错误做法。

举个例子:


def mutable_arg(x=[]):
    x.append(3)
    print(x)

def immutable_arg(x=None):
    x = x or []
    x.append(3)
    print(x)

mutable_arg() # prints [3]
mutable_arg() # prints [3,3]
immutable_arg() # prints [3]
immutable_arg() # prints [3]

immutable_arg中,它为每个调用创建一个新列表,而不是重新使用与mutable_arg相同的默认值

© www.soinside.com 2019 - 2024. All rights reserved.