В 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