【发布时间】:2019-08-06 17:15:38
【问题描述】:
以下代码
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 时不会重置。
这显然不是错误,而是设计使然。
我的问题是为什么这是理想的行为?对我来说,这似乎更令人困惑而不是有用,这会让我永远不想使用不可变的默认值。
【问题讨论】:
-
默认值的计算成本可能比空列表字面值高得多,在这种情况下,您只需在定义函数时评估它一次,而不是每次调用函数。
-
另外,已经有一种方法可以在每次调用时执行代码:将其放在函数体中。
-
@chepner 关于您的第二条评论 - 显然将代码放入函数体中会在每次调用时执行它。但是在命名参数中放置一个变量真的是创建“静态”变量的pythonic方式吗?
-
@Gulzar 将默认 arg 设为不可变类型是 pythonic。但是,如果这就是 static 的意思,它不会强制输入。这就是为什么你可以拥有
some_arg=None并用不同的类型替换它 -
@Gulzar 创建 C 风格静态变量的 Pythonic 方法是定义类的方法。但仅仅因为可变默认参数没有强大或明显的用例并不意味着有令人信服的理由禁止它。
标签: python reference pass-by-reference default-value