在函数中使用空元组作为默认的可迭代参数

时间:2013-10-29 17:24:00

标签: python

使用空元组作为函数的可迭代参数的默认值是否有任何缺点?假设你在函数中想要的是一个不可变的迭代。 e.g。

def foo(a, b=()):
  print a
  for x in b:
    print x

我似乎找不到这个用例的很多例子。

2 个答案:

答案 0 :(得分:9)

我不能想到任何缺点,因为当你需要一个不可变的迭代时。我认为它只是没有被使用,因为default_list=Nonedefault_list = default_list or None模式是用于可变迭代的模式,人们不需要在更少的时候改变它(因为没有实际需要)当iterable不可变时经常出现的情况。与可变的默认参数一样,肯定没有意外的行为。

答案 1 :(得分:1)

将默认设计为不可变的空元组没有内在问题。但是,它可以被认为是一种非直观的设计方法。对元组中特定位置的任何引用都会引发异常。如果你对创建参数检查足够小心,那么这不会是一个问题,但是如果你构建其余代码以期望来自特定位置的数据并且不验证元组是否为空,那么这将导致错误。

这取决于你的目标是什么。一个空列表将有一个更明显的默认参数应用程序(至少那些以某种方式修改列表的应用程序),但是一个空的不可变元组除了表明没有给出参数外,不会有任何直观的用法作为默认值。

默认参数的典型方法是将它们设置为 None ,这使得在未设置参数时非常清楚:

def foo(a, b=None):