Python 中的可选列表参数“list = list or []”

问题描述 投票:0回答:3

处理可选列表参数的传统方法如下:

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

我想知道以下(较短的)版本是否有任何陷阱?为什么没有人这样做?是不是觉得比较晦涩难懂?

list_of_vals = list_of_vals or []
python list immutability optional-arguments
3个回答
9
投票

模式

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

您使用

or
的建议在逻辑上偏离
bool(list_of_vals) == False
list_of_vals is not None
,所以我建议不要这样做。

另一个可能的选择是使用空元组“鸭子类型”:

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

因为元组是不可变的,所以这没有可变默认列表的缺陷。在许多用例中,您只需要输入容器可索引和可迭代,因此

vals
可以愉快地保留为元组。


1
投票

有两种情况,您希望可以在函数外部更改列表,那么第二个变体会阻止使用以下方式调用

a

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

如果你想防止列表参数发生变化,你应该在里面复制一份

a

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

0
投票

由于其他评论中提到的原因,输入空列表可能会与 None 混淆,我会这样做:

list_of_vals = [] if list_of_vals is None else list_of_vals

稍微冗长一些,但仍然是一句台词

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