Python默认参数中的空可迭代对象

3
在这种方法中,我明白为什么不能使用空列表:
  def some_method(self,a,b=[]):
      for x in b:
          etc...

我知道推荐的做法是这样的:

  def some_method(self,a,b=None):
      b = b or []
      for x in b:
          etc...

但是,对于一个非常明确只读的值b,为什么不使用这个(一个空元组):

  def some_method(self,a,b=()):
      for x in b:
          etc...

我认为在这种情况下更清晰。我错了吗?

1
在我看来不错。有什么来源说明按你展示的方式去做吗? - Jonathon Reinhart
我感觉这两个表达略有不同。b=None 的意思是“b 是一个可选参数,因为我没有指定 b,所以执行不同的行为”。而另一个则是“按预期对这个空列表执行操作”。 - michaelb
我同意你的观点。“特殊情况并不够特殊”。任何默认值都已经表明了“可选参数”的含义。 - Karl Knechtel
@JonathonReinhart 没有明确说明不可以...但是在我所读到的关于默认列表的所有内容中,除了我的第二个例子之外,没有人建议其他方法。 - Nelz
1个回答

1
元组技术应该可行,尽管不常见。值得注意的是,如果您确实没有写入 b ,那么它是一个列表也不会对您造成影响。
我唯一(吹毛求疵的)反对意见是,在语义上,元组理想情况下更像记录(类似于日期时间结构),而不是值的同质序列。
我也同意上面的michaelb所说,“空序列”和None的语义是不同的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接