在Python中,为什么list(None)是错误但是[None]不是?

时间:2014-06-09 12:36:19

标签: python list

None传递给Python的list构造函数是TypeError

>>> l = list(None)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not iterable

但是使用括号来实例化list很好;使用None和内置函数也很好:

>>> l = [None]
>>> l.append(None)
>>> l
[None, None]

我的理解是,list()[]是创建新list的等效方式。我错过了什么?

4 个答案:

答案 0 :(得分:21)

他们不等同于list()尝试迭代其参数,使每个对象成为单独的列表项,而列表文字[]只是完全按照它给出的内容。比较:

>>> list("foo")
['f', 'o', 'o']
>>> ["foo"]
['foo']

您无法重复None,因此错误。对于任何不可迭代的参数,您都会得到相同的结构:

>>> list(1)
Traceback (most recent call last):
  File "<pyshell#14>", line 1, in <module>
    list(1)
TypeError: 'int' object is not iterable

要使用a = [None]获得等效的list(),您必须将其传递给包含单个对象的迭代,例如

a = list([None])

虽然这会创建列表文字,然后复制它,所以在这个简单的例子中并不是非常有用!

答案 1 :(得分:1)

执行[None]时,您正在创建一个新列表,其中包含一个元素None。要使用list构造函数,您可以复制如下列表:

list([None])

list构造函数接受iterables(它可以迭代的对象),而不是单个元素。

答案 2 :(得分:1)

因为跟踪说,list期望迭代(列表,元组等等),而None不是一个。例如,这将起作用:

list([None])
list((1, 2, 3))

这将失败:

list(None)
list(1, 2, 3)

答案 3 :(得分:0)

只是因为[None]不是空列表,因为它包含None

>>> len([None])
1
>>> len(None)
TypeError: object of type 'NoneType' has no len()
>>> len([])
0