x = None或object()是否等于显式检查?

时间:2013-01-20 23:42:02

标签: python python-3.x

我有函数声明,如:

def function(list_of_objects = None)

如果没有传递* list_of_objects *(是None)我需要像空列表一样定义它。明确的方法是:

def function(list_of_objects = None):
    if not list_of_objects:
        list_of_objects = list()

def function(list_of_objects = None):
    list_of_objects = list() if not list_of_objects else list_of_objects

上面的代码是否等于下一个?

def function(list_of_objects = None):
    list_of_objects = list_of_objects or list()

我测试了它,但我仍然不确定

>>> def func(my_list = None):
...     my_list = my_list or list()
...     print(type(my_list), my_list)
... 
>>> func()
(<type 'list'>, [])
>>> func(['hello', 'world'])
(<type 'list'>, ['hello', 'world'])
>>> func(None)
(<type 'list'>, [])
>>> 

3 个答案:

答案 0 :(得分:7)

不,因为None不是唯一的假对象。还包括[]()0,当然还有False

答案 1 :(得分:3)

惯用法是:

def function(list_of_objects=None):
    if list_of_objects is None:
        list_of_objects = []

None是一个单身人士,因此您可以使用is运算符进行比较。

您的代码测试list_of_objects的真实性(在这种情况下,所有ifor变体都是等效的)。 The following values are considered false in Python

  • 任何数字类型的零,例如00.00j

  • 任何空序列,例如''()[]

  • 任何空映射,例如{}

  • 用户定义类的实例,如果类定义了__bool__()__len__()方法,则该方法返回整数零或bool值为False。

所有其他值都被认为是真的 - 因此许多类型的对象始终为真。

答案 2 :(得分:2)

通常的做法是:

def function(list_of_objects=None):
    if list_of_objects is None:
        list_of_objects = []
    ...

使用,因为很容易区分其他错误值,例如空列表或空元组。

使用is None测试而不是相等测试,因为是单身(这是首选练习,每PEP 8)。