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

Ben*_*Ben 16 python

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

def foo(a, b=()):
  print a
  for x in b:
    print x
Run Code Online (Sandbox Code Playgroud)

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

rlm*_*lms 9

当你需要一个不可变的迭代时,我想不出任何缺点.我认为它只是没有被使用,因为default_list=Nonedefault_list = default_list or None模式是用于可变迭代的东西,并且当迭代是不可变的时候,人们不会在不常发生的情况下改变它(因为没有实际需要).与可变的默认参数一样,肯定没有意外的行为.


Psw*_*s87 6

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

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

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

def foo(a, b=None):
Run Code Online (Sandbox Code Playgroud)