Verifica se tipo == elenco in Python


185

Potrei avere una scoreggia cerebrale qui, ma davvero non riesco a capire cosa c'è che non va nel mio codice:

for key in tmpDict:
    print type(tmpDict[key])
    time.sleep(1)
    if(type(tmpDict[key])==list):
        print 'this is never visible'
        break

l'output è <type 'list'>ma l'istruzione if non si attiva mai. Qualcuno può individuare il mio errore qui?


3
Hai usato listcome variabile da qualche parte? Attenzione, se si lavora nel REPL o simili, potrebbe essere ancora ridefinito da tempo.
Ffisegydd,

..... Woooowww ... sicuramente una lezione per quanto riguarda le carenze delle lingue digitate. Wow ...
Benjamin Lindqvist,

Aggiungilo come risposte e accetterò. GRAZIE.
Benjamin Lindqvist,

1
Pylint e i tuoi amici ti aiuteranno in futuro (non lo definirei un difetto, davvero).

Risposte:


140

Il problema è che hai ridefinito listcome variabile precedentemente nel tuo codice. Ciò significa che quando lo fai type(tmpDict[key])==listse tornerà Falseperché non sono uguali.

Detto questo, dovresti invece usare isinstance(tmpDict[key], list)durante il test del tipo di qualcosa, questo non eviterà il problema di sovrascrivere listma è un modo più Pythonic di controllare il tipo.


Bello. "più Pythonic" è un concetto ampio. solo per motivi di educazione: quali sono le differenze tra tipo e istanza?
Javi

222

Dovresti provare a usare isinstance()

if isinstance(object, list):
       ## DO what you want

Nel tuo caso

if isinstance(tmpDict[key], list):
      ## DO SOMETHING

Elaborare:

x = [1,2,3]
if type(x) == list():
    print "This wont work"
if type(x) == list:                  ## one of the way to see if it's list
    print "this will work"           
if type(x) == type(list()):
    print "lets see if this works"
if isinstance(x, list):              ## most preferred way to check if it's list
    print "This should work just fine"

EDIT 1: La differenza tra isinstance()e type()e perché il modo isinstance()più preferito di verificare è che isinstance()controlla anche le sottoclassi, mentre type()no.


22

Questo sembra funzionare per me:

>>>a = ['x', 'y', 'z']
>>>type(a)
<class 'list'>
>>>isinstance(a, list)
True


0

Anche se non è così semplice come isinstance(x, list)si potrebbe usare:

this_is_a_list=[1,2,3]
if type(this_is_a_list) == type([]):
    print("This is a list!")

e mi piace la semplice intelligenza di ciò

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.