2

我有函数声明,如:

def function(list_of_objects = None)

如果 *list_of_objects* 没有通过(没有),我需要将它定义为空列表。明确的方式是:

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'>, [])
>>> 
4

3 回答 3

7

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

于 2013-01-20T23:43:57.390 回答
3

惯用的方法是:

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

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

您的代码测试真实性list_of_objects(在这种情况下,所有ifor变体都是等效的)。以下值在 Python 中被认为是错误的

  • 没有任何

  • 错误的

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

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

  • 任何空映射,例如{}.

  • 用户定义类的实例,如果该类定义了一个__bool__()__len__()方法,当该方法返回整数零或布尔值 False。

所有其他值都被认为是真的——所以许多类型的对象总是真的。

于 2013-01-21T00:05:27.057 回答
2

通常的做法是:

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

使用None是因为它很容易与其他错误值(例如空列表或空元组)区分开来。

使用is None测试而不是相等测试,因为None是单例(根据PEP 8 ,这是首选做法)。

于 2013-01-21T00:27:37.527 回答