Vérifier si type == list en python

185

J'ai peut-être un cerveau péter ici, mais je ne peux vraiment pas comprendre ce qui ne va pas avec mon code:

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

la sortie est <type 'list'>mais l'instruction if ne se déclenche jamais. Quelqu'un peut-il repérer mon erreur ici?

Benjamin Lindqvist
la source
3
Avez-vous utilisé listcomme variable quelque part? Sachez que si vous travaillez dans le REPL ou autre, il peut encore être redéfini il y a quelque temps.
Ffisegydd
..... Woooowww ... certainement une leçon concernant les lacunes des langages à frappe douce. Wow ...
Benjamin Lindqvist
Ajoutez-le comme réponse et j'accepterai. MERCI.
Benjamin Lindqvist
1
Pylint et ses amis vous aideront à l'avenir (je n'appellerais pas cela une lacune, vraiment).

Réponses:

140

Votre problème est que vous avez redéfini en listtant que variable précédemment dans votre code. Cela signifie que lorsque vous le ferez, vous type(tmpDict[key])==listreviendrez Falsecar ils ne sont pas égaux.

Cela étant dit, vous devriez plutôt l'utiliser isinstance(tmpDict[key], list)lors du test du type de quelque chose, cela n'évitera pas le problème de l'écrasement listmais c'est une manière plus pythonique de vérifier le type.

Ffisegydd
la source
Agréable. «plus pythonique» est un vaste concept. juste pour le bien de l'éducation: quelles-sont-les-différences-entre-type-et-est-une-instance?
Javi
222

Vous devriez essayer d'utiliser isinstance()

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

Dans ton cas

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

Élaborer:

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 différence entre isinstance()et type()et pourquoi la manière la isinstance()plus préférée de vérifier est de isinstance()vérifier les sous-classes en plus, alors que ce type()n'est pas le cas.

d-coder
la source
22

Cela semble fonctionner pour moi:

>>>a = ['x', 'y', 'z']
>>>type(a)
<class 'list'>
>>>isinstance(a, list)
True
Prométhée
la source
0

Python 3.7.7

import typing
if isinstance([1, 2, 3, 4, 5] , typing.List):
    print("It is a list")
Aravind Krishnakumar
la source
0

Bien que ce ne soit pas aussi simple isinstance(x, list)qu'on pourrait l'utiliser aussi:

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

et j'aime un peu l'intelligence simple de ça

remigiusz boguszewicz
la source