2014-06-09 13 views
6

Passando None-list costruttore di Python è un TypeError:In Python, perché è elencato (Nessuno) un errore ma [Nessuno] non lo è?

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

Ma usando le parentesi per creare un'istanza di un list va bene; utilizzando None con le funzioni built-in è anche bene:

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

La mia comprensione è che list() e [] erano modalità equivalenti di creazione di un nuovo list. Cosa mi manca?

+4

No, 'lista()' e '[]' sono ** non ** equivalente. 'list ([...])' e '[...]' sarebbero equivalenti. 'lista ('a', 'b', 'c')' * non funziona neanche *. –

+0

@MartijnPieters Non penso che sia esatto. 'list ([...])' creerà una copia. – wim

+0

@wim: Certo, e la lista che hai passato viene scartata di nuovo. Il risultato finale è lo stesso. Il punto è che 'list (...)' non è lo stesso qui. –

risposta

21

Sono non equivalenti. list() tenta di ripetere il suo argomento, rendendo ogni oggetto un elemento di elenco separato, mentre un letterale di elenco [] prende esattamente esattamente ciò che viene fornito. Confronto:

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

Non si può iterare None, da qui l'errore. Si otterrà lo stesso con qualsiasi argomento non iterabile:

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

Per ottenere l'equivalente di a = [None] usando list(), si dovrà passare un iterabile con un singolo oggetto in, ad esempio,

a = list([None]) 

anche se questo creerà l'elenco letterale e quindi copiarlo, quindi non è molto utile in questo esempio banale!

0

Semplicemente perché [None] non è una lista vuota, in quanto contiene None!

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

Quando si esegue [None] si sta creando una nuova lista, con un elemento, che è None. Per utilizzare list costruttore è possibile copiare una lista come questa:

list([None]) 

list costruttore accetta iterables (oggetto su cui si può iterare), non elementi singoli.

1

Perché, come ha detto il traceback, list si aspetta un iterabile (elenco, tupla, ecc.) E Nessuno non lo è. Per esempio, questo funzionerà:

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

Questo fallirà:

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