Sprawdzanie, czy w liście Python wpisz == lista

185

Być może mam tu pierdnięcie mózgu, ale naprawdę nie mogę zrozumieć, co jest nie tak z moim kodem:

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

dane wyjściowe są, <type 'list'>ale instrukcja if nigdy się nie uruchamia. Czy ktoś może tutaj zauważyć mój błąd?

Benjamin Lindqvist
źródło
3
Czy listużywałeś gdzieś jako zmiennej? Uważaj, jeśli pracujesz w REPL lub coś takiego, może to być przedefiniowane jakiś czas temu.
Ffisegydd
..... Woooowww ... zdecydowanie lekcja na temat wad słabo pisanych języków. Wow ...
Benjamin Lindqvist
Dodaj jako odpowiedzi, a ja zaakceptuję. DZIĘKI.
Benjamin Lindqvist
1
Pylint i przyjaciele pomogą ci w przyszłości (naprawdę nie nazwałbym tego mankamentem).

Odpowiedzi:

140

Problem polega na tym, że ponownie zdefiniowałeś listwcześniej zmienną w kodzie. Oznacza to, że kiedy to zrobisz, type(tmpDict[key])==listjeśli wróci, Falseponieważ nie są równe.

To powiedziawszy, powinieneś zamiast tego używać isinstance(tmpDict[key], list)podczas testowania typu czegoś, nie pozwoli to uniknąć problemu nadpisywania, listale jest bardziej pythonicznym sposobem sprawdzania typu.

Ffisegydd
źródło
Miły. „więcej Python” to szeroka koncepcja. tylko ze względu na edukację: jakie są różnice między typem a instancją?
Javi
221

Powinieneś spróbować użyć isinstance()

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

W Twoim przypadku

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

Opracować:

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"

EDYCJA 1: Różnica między isinstance()i type()dlaczego isinstance()najbardziej preferowanym sposobem sprawdzania jest isinstance()sprawdzenie dodatkowo podklas, podczas gdy type()nie.

d-koder
źródło
22

Wydaje mi się, że to działa:

>>>a = ['x', 'y', 'z']
>>>type(a)
<class 'list'>
>>>isinstance(a, list)
True
Prometeusz
źródło
0

Python 3.7.7

import typing
if isinstance([1, 2, 3, 4, 5] , typing.List):
    print("It is a list")
Aravind Krishnakumar
źródło
0

Chociaż nie tak proste, jak isinstance(x, list)można by użyć:

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

i podoba mi się prosta sprytność tego

remigiusz boguszewicz
źródło