Python中的惯用方法,如何管理函数中的默认参数

3

我通常遇到的情况是,大多数人会像这样在函数或方法中处理默认参数值:

def foo(L=None):
  if L is None:
    L = []

然而,我看到其他人在做这样的事情:
def foo(L=None):
  L = L or []

我不知道是否有遗漏,但为什么大多数人使用第一个方法而非第二个方法?它们是否完全相同?第二个方法似乎更清晰、更简短。

3个回答

6
它们并不相等。第一种方法确切地检查给定参数L是否为None。第二种方法检查L在Python中的真实性。在Python中,如果您在条件中检查列表,则规则如下:
  1. 列表为空,则为False
  2. 否则为True
那么这两种方法有什么区别?请看下面的代码。
第一种方法:
def foo(L=None):
    if L is None:
        L = []
    L.append('x')
    return L

>>> my_list = []
>>> foo(my_list)
>>> my_list
['x']

第二点:

def foo(L=None):
    L = L or []
    L.append('x')
    return L

>>> my_list = []
>>> foo(my_list)
>>> my_list
[]

第一个并没有创建新的列表,而是使用了给定的列表。但是第二个创建了一个新的列表。


1
如果参数是一个假值,则这两者并不相等。通常情况下,这并不重要,因为许多假值不适合作为大多数函数的参数。但仍然存在可能的情况。例如,如果一个函数应该填充一个字典(如果没有给出则创建一个新的),而有人传递了一个空有序字典,则后一种方法将错误地返回一个普通字典。
但这不是我总是使用“is None”版本的主要原因。我更喜欢它,因为它更加明确,“or”返回其操作数之一的事实对我来说并不直观。只要我能忘记它,我就会很高兴;-)额外的一行不是问题,这相对较少见。

0

也许他们不知道第二个?我倾向于使用第一个。

实际上有区别。如果传递任何计算为布尔假的值,如0、空字符串或其他值,第二个将使L=[]。只有在未传递L或将其作为None传递时,第一个才会这样做。


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