我经常遇到大多数人在这样的函数或方法中管理默认参数值:
def foo(L=None):
if L is None:
L = []
但是我看到其他人做的事情如下:
def foo(L=None):
L = L or []
我不知道我是否遗漏了一些东西但是,为什么大多数人使用第一种方法而不是第二种?它们是同样的东西吗?似乎第二个更清晰,更短。
答案 0 :(得分:6)
他们并不平等。
第一种方法检查确切,给定arg L
是None
。
第二次检查,L是以python方式为真。在python中,如果您在条件中检查列表,则规则如下:
那么提到的方法之间的区别是什么?比较这段代码。
首先:
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 :(得分:1)
如果参数是false-y值,则两者不等效。这并不常见,因为许多假y值不适合您执行此操作的大多数函数。尽管如此,仍然存在可能的重要情况。例如,如果一个函数应该填充一个字典(如果没有给出,则创建一个新的字典),而有人传递一个空的有序字典,那么后一种方法将错误地返回一个普通的字典。
这不是我一直使用is None
版本的主要原因。我更喜欢它,因为它更明确,or
返回其操作数之一的事实对我来说并不直观。我喜欢忘记它,只要我能;-)额外的线不是问题,这是相对罕见的。
答案 2 :(得分:0)
也许他们不知道第二个?我倾向于使用第一个。
实际上存在差异。如果你传递任何评估为布尔值false的东西,第二个将让L = []。 0空字符串或其他。如果没有传递L或者传递为None,则第一个只会这样做。