python 中的可选列表参数 "list = list or []"

optional list argument "list = list or []" in python

处理可选列表参数的常规方法如下:

def func(list_of_vals = None):
   if list_of_vals is None:
      list_of_vals = []
   ...

我想知道以下(较短的)版本是否有任何缺陷?为什么没有人这样做?它是否被认为更晦涩?

list_of_vals = list_of_vals or []

模式 if arg is None: 很常见,Python 开发人员很熟悉,没有奇怪的边缘情况。 我的建议是遵循惯例

您使用 or 的建议在 bool(list_of_vals) == Falselist_of_vals is not None 时逻辑上有偏差,所以我建议不要这样做。

另一种可能的选择是 "duck type" 使用空元组:

def a(vals=()):
    ...

因为元组是不可变的,所以这有 none 可变默认列表的陷阱。在许多用例中,您只需要输入容器是可索引和可​​迭代的,因此 vals 可以愉快地保留为元组。

有两种情况,您希望列表可以在函数外更改,然后第二个变体阻止调用 a

some_list = []
a(some_list)
print(some_list)

如果你想防止列表参数的改变,你应该在里面复制一份a

def a(l=()):
    l = list(l)