Python'da == list türünün olup olmadığını kontrol etme


185

Burada bir beyin osuruğu yaşıyor olabilirim, ama kodumda neyin yanlış olduğunu gerçekten anlayamıyorum:

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

çıktı <type 'list'>ancak if ifadesi hiçbir zaman tetiklenmez. Burada hatamı kimse fark edebilir mi?


3
Bir listyerde değişken olarak kullandınız mı ? REPL veya benzeri bir ortamda çalışıyorsanız, bir süre önce yeniden tanımlanabileceğini unutmayın.
Ffisegydd

..... Woooowww ... kesinlikle yumuşak yazılan dillerin eksikliklerine dair bir ders. Vay be ...
Benjamin Lindqvist

Cevap olarak ekleyin ve kabul edeceğim. TEŞEKKÜRLER.
Benjamin Lindqvist

1
Pylint ve arkadaşları gelecekte size yardımcı olacaktır (bunu gerçekten bir eksiklik olarak adlandırmazdım).

Yanıtlar:


140

Sorununuz, listdaha önce kodunuzda bir değişken olarak yeniden tanımlanmış olmanızdır . Bu, yaptığınız zaman type(tmpDict[key])==listgeri dönecekleri anlamına gelir, Falseçünkü bunlar eşit değildir.

Bununla birlikte isinstance(tmpDict[key], list), bir şeyin türünü test ederken kullanmalısınız , bu üzerine yazma sorununu önleyemez, listancak türü kontrol etmenin daha Pythonic bir yoludur.


Güzel. 'daha fazla Pythonic' geniş bir kavramdır. sadece eğitim uğruna: tip ve isinstance arasındaki farklar nelerdir?
Javi

222

Kullanmayı denemelisin isinstance()

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

Senin durumunda

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

Detaylandırmak için:

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"

DÜZENLEME 1: arasındaki fark isinstance()ve type()ve neden isinstance()check en çok tercih edilen yoldur olmasıdır isinstance()ederken, ek olarak çekler alt sınıfları type()yok.


22

Bu benim için işe yarıyor gibi görünüyor:

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


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.