在Python中设置应该是列表的参数的默认值的最佳实践?

Jac*_*k Z 62 python pylint default-value

我有一个Python列表作为参数.如果我将参数的默认值设置为空列表,如下所示:

def func(items=[]):
    print items
Run Code Online (Sandbox Code Playgroud)

Pylint会告诉我"危险的默认值[]作为参数".所以我想知道这里的最佳做法是什么?

Sve*_*ach 88

使用None作为默认值:

def func(items=None):
    if items is None:
        items = []
    print items
Run Code Online (Sandbox Code Playgroud)

可变默认参数的问题在于它将在函数的所有调用之间共享 - 请参阅Python教程相关部分中的 "重要警告" .

  • 如果我希望`items`是一个可迭代的类型,我通常会写`items = items或[]`. (5认同)
  • @wim:我认为你的意思是'静态的',而不是强烈的意思; python强烈但动态地输入. (3认同)
  • 啊哇,我很惊讶人们都知道这件事.=)我非常讨厌python的这个特性,所以我编写了自己的装饰器库以允许`func(items = new([]))`语法. (2认同)

sfi*_*ink 8

我刚刚第一次遇到这个问题,我的想法是"好吧,我不想改变列表,所以我真正想要的是默认为不可变列表,所以如果我不小心Python会给我一个错误改变它." 不可变列表只是一个元组.所以:

  def func(items=()):
      print items

当然,如果你将它传递给真正想要列表的东西(例如isinstance(items,list)),那么这将让你陷入困境.但无论如何这都是代码味道.

  • 如果在函数内部需要复制,请使用`my_copy = list(items)`.您想出了一个简单而且非常聪明的解决方案来解决常见问题. (3认同)