将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
的等效方式。我错过了什么?
答案 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