24

使用空元组作为函数的可迭代参数的默认值有什么缺点吗?假设你想要的函数是一个不可变的迭代。例如

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

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

4

2 回答 2

16

我想不出任何缺点,因为当你需要一个不可变的迭代时。我认为它只是没有被使用,因为default_list=Noneanddefault_list = default_list or None模式是用于可变迭代的,并且在迭代不可变的不太频繁发生的情况下,人们不会费心去改变它(因为没有真正的需要)。与可变的默认参数一样,肯定没有意外的行为。

于 2013-10-29T17:30:08.013 回答
6

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

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

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

def foo(a, b=None):
于 2013-10-29T17:56:28.910 回答