В Python почему list (None) является ошибкой, а [None] - нет?

передает None для питона 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 ответов


они не эквивалентны. 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(), вы должны были бы передать его iterable с одним объектом в, например,

a = list([None])

хотя это создаст литерал списка, а затем скопирует его, поэтому не очень полезно в этом тривиальном примере!


когда вы [None] вы создаете новый список с одним элементом, которая составляет None. Использовать list конструктор вы можете скопировать такой список следующим образом:

list([None])

list конструктор принимает iterables (объект, над которым он может выполнять итерации), а не отдельные элементы.


Так как вывод сказал:list ожидает итерируемый (список, кортеж и т. д...) , и никто не один. Например, это будет работать :

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

Это плохо:

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

просто так [None] не является пустым списком, так как он содержит None!

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