【问题标题】:optional list argument "list = list or []" in pythonpython中的可选列表参数“list = list or []”
【发布时间】:2017-03-11 20:15:04
【问题描述】:

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

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

如果以下(较短的)版本有任何陷阱,我会感到很困惑?为什么没有人这样做?它被认为更晦涩难懂吗?

list_of_vals = list_of_vals or []

【问题讨论】:

  • 我这样做,我认为这很棒。体面的python程序员会理解它。但是使用l作为变量名,那就不好了。
  • @AlexHall ,当然,这只是说明一个想法的示例代码
  • 如果有人明确传递了一个空列表,您将创建一个新列表。这可能不是他们所期望的。
  • @jonrsharpe 不幸的是,Python 中的空列表是错误的,这一事实给模式带来了麻烦。
  • @Barmar 是的,如果他们也遵循 "either mutate or return" 模式应该没问题

标签: python list immutability optional-arguments


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 我觉得如果传递给函数的典型值类型 (list) 与默认值类型 (tuple) 不同,那可能更具误导性
  • 这是个好主意。如果传递的列表预计会被函数修改(这对于可选参数来说会很奇怪),它将不起作用,但否则它甚至暗示了不变性,这是一个加号。
  • @BenUsman 一个好的 Python 函数应该尽可能少地关心参数的类型。
  • vals = vals if vals is not None else [] 可能介于两者之间? (简短、易读和常规)
【解决方案2】:

有两种情况,你希望列表可以在函数之外被改变,那么第二个变体阻止调用a

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

如果你想防止列表参数的改变,你应该在a里面做一个副本

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

【讨论】:

    猜你喜欢
    • 2017-10-19
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-10
    • 2015-01-12
    • 2016-12-11
    相关资源
    最近更新 更多