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.