2014-06-09 14 views
6

Passing None-list Konstruktor Python ist ein TypeError:In Python, warum ist Liste (None) ein Fehler, aber [None] ist nicht?

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

Aber Klammern ein instanziiert list ist in Ordnung; mit None mit den integrierten Funktionen ist auch in Ordnung:

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

Mein Verständnis war, dass list() und [] waren gleichwertige Möglichkeiten, eine neue list zu schaffen. Was vermisse ich?

+4

Nein, 'Liste()' und '[]' sind ** ** nicht gleichwertig. 'liste ([...])' und '[...]' wäre äquivalent. 'list ('a', 'b', 'c')' * funktioniert auch nicht *. –

+0

@MartijnPieters Ich denke nicht, dass das genau ist. 'list ([...])' 'erstellt eine Kopie. – wim

+0

@wim: Sicher, und die Liste, die Sie übergeben haben, wird wieder verworfen. Das Endergebnis ist das gleiche. Der Punkt ist mehr, dass "Liste (...)" hier nicht gleich ist. –

Antwort

21

Sie sind nicht gleichwertig. list() versucht, über sein Argument zu iterieren, wodurch jedes Objekt zu einem separaten Listenelement wird, während ein Listenliteral [] genau das nimmt, was es gegeben hat. Vergleichen:

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

Sie nicht über None laufen können, daher die Fehler. Sie werden das gleiche mit jedem Nicht-iterable Argument bekommen:

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

Um das Äquivalent von a = [None] mit list() zu bekommen, würden Sie es ein iterable mit einem einzigen Objekt übergeben müssen, die z.B.

obwohl dies wird die Liste Literal erstellen und kopieren Sie es dann, ist also nicht sehr nützlich in diesem trivialen Beispiel!

0

Einfach weil [None] keine leere Liste ist, da sie None enthält!

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

Wenn Sie das tun [None] Sie eine neue Liste erstellen, mit einem Element, das None ist. So verwenden list Konstruktor können Sie eine solche Liste wie folgt kopieren:

list([None]) 

list Konstruktor akzeptiert Iterables (Objekt, über die sie durchlaufen kann), nicht einzelne Elemente.

1

Da die Traceback sagte, erwartet list eine iterable (Liste, Tupel, etc ...), und keiner ist nicht eins. Zum Beispiel wird diese Arbeit:

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

Dieses fehl:

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