Überprüfen Sie, ob type == list in Python ist


184

Ich habe hier vielleicht einen Hirnfurz, aber ich kann wirklich nicht herausfinden, was mit meinem Code nicht stimmt:

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

Die Ausgabe ist <type 'list'>aber die if-Anweisung wird nie ausgelöst. Kann jemand meinen Fehler hier erkennen?


3
Haben Sie listirgendwo als Variable verwendet? Beachten Sie, dass wenn Sie in der REPL oder einer anderen arbeiten, diese möglicherweise noch vor einiger Zeit neu definiert wurde.
Ffisegydd

..... Woooowww ... definitiv eine Lektion in Bezug auf die Mängel von sanft getippten Sprachen. Wow ...
Benjamin Lindqvist

Füge es als Antwort hinzu und ich werde akzeptieren. VIELEN DANK.
Benjamin Lindqvist

1
Pylint und Freunde werden dir in Zukunft helfen (ich würde das nicht wirklich als Mangel bezeichnen).

Antworten:


136

Ihr Problem ist, dass Sie listzuvor in Ihrem Code als Variable neu definiert haben . Dies bedeutet, dass wenn Sie dies tun, type(tmpDict[key])==listif zurückkehrt, Falseweil sie nicht gleich sind.

Abgesehen davon sollten Sie stattdessen isinstance(tmpDict[key], list)beim Testen des Typs etwas verwenden. Dies vermeidet nicht das Problem des Überschreibens, listsondern ist eine pythonischere Methode zum Überprüfen des Typs.


Nett. 'mehr Pythonic' ist ein weit gefasstes Konzept. Nur um der Bildung willen: Was sind die Unterschiede zwischen Typ und Instanz?
Javi

219

Sie sollten versuchen, zu verwenden isinstance()

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

In deinem Fall

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

Um dies zu erläutern:

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"

22

Das scheint bei mir zu funktionieren:

>>>a = ['x', 'y', 'z']
>>>type(a)
<class 'list'>
>>>isinstance(a, list)
True
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.