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

在Python中,为什么list(None)是一个错误,而[None]不是?,python,list,Python,List,将None传递给Python的列表构造函数是一个类型错误: >>> l = list(None) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'NoneType' object is not iterable 我的理解是list()和[]是创建新列表的等效方法。我缺少什么?仅仅是因为[None]不是一个空列表,因为它包含无 >

None
传递给Python的
列表
构造函数是一个
类型错误

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

我的理解是
list()
[]
是创建新
列表的等效方法。我缺少什么?

仅仅是因为
[None]
不是一个空列表,因为它包含

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

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

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

它们不是等价的
list()
尝试迭代其参数,使每个对象成为一个单独的列表项,而list literal
[]
只获取给定的内容。比较:

>>> list("foo")
['f', 'o', 'o']
>>> ["foo"]
['foo']
您不能迭代
None
,因此会出现错误。对于任何不可iterable参数,您都会得到相同的结果:

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

虽然这将创建列表文字,然后复制它,但在这个简单的示例中并不是非常有用

因为正如回溯所说,
list
需要一个iterable(list、tuple等),而None不是一个。例如,这将起作用:

list([None])
list((1, 2, 3))
这将失败:

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

不,
list()
[]
不等效<代码>列表([…])
[…]
是等效的<代码>列表('a','b','c')也不起作用。@MartijnPieters我认为这不准确<代码>列表([…])将创建一个副本。@wim:当然,您传入的列表将再次被丢弃。最终结果是一样的。重点是,
list(…)
在这里不一样。
list([None])
list((1, 2, 3))
list(None)
list(1, 2, 3)