0

根据starlark规范

如果函数参数的默认值是可变表达式,则在一次调用期间对该值的修改可能会被后续调用观察到。使用列表或字典作为默认值时要注意这一点。如果函数被冻结,其参数的默认值也会被冻结。

他们的规范提供了以下示例

# module a.sky
def f(x, list=[]):
  list.append(x)
  return list

f(4, [1,2,3])           # [1, 2, 3, 4]
f(1)                    # [1]
f(2)                    # [1, 2], not [2]!

# module b.sky
load("a.sky", "f")
f(3)                    # error: cannot append to frozen list

我发现示例中解释的行为 f(2) # [1, 2], not [2]!反直觉,我想知道这种行为在 starklark 中的意义何在?似乎这种行为使代码更难阅读,那么这种行为有什么好处?

4

0 回答 0