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) == False
和 list_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)
处理可选列表参数的常规方法如下:
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) == False
和 list_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)