Memeriksa apakah ketik == daftar dalam python


185

Saya mungkin punya otak kentut di sini, tapi saya benar-benar tidak tahu apa yang salah dengan kode saya:

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

output hanyalah <type 'list'>pernyataan if jika tidak pernah terpicu. Adakah yang bisa melihat kesalahan saya di sini?


3
Sudahkah Anda menggunakan listvariabel di suatu tempat? Berhati-hatilah bahwa jika Anda bekerja di REPL atau semacamnya mungkin masih didefinisikan ulang beberapa waktu yang lalu.
Ffisegydd

..... Woooowww ... pasti pelajaran tentang kekurangan bahasa yang diketik dengan lembut. Wow ...
Benjamin Lindqvist

Tambahkan sebagai jawaban dan saya akan menerimanya. TERIMA KASIH.
Benjamin Lindqvist

1
Pylint dan teman-teman akan membantu Anda di masa depan (saya tidak akan menyebut ini kekurangan, sungguh).

Jawaban:


140

Masalah Anda adalah bahwa Anda telah mendefinisikan listkembali variabel sebelumnya dalam kode Anda. Ini berarti bahwa ketika Anda melakukannya, type(tmpDict[key])==listakan kembali Falsekarena mereka tidak sama.

Yang sedang berkata, Anda sebaiknya menggunakan isinstance(tmpDict[key], list)ketika menguji jenis sesuatu, ini tidak akan menghindari masalah menimpa listtetapi merupakan cara yang lebih Pythonic untuk memeriksa jenis.


Bagus. 'lebih Pythonic' adalah konsep yang luas. hanya demi pendidikan: apa perbedaan antara tipe dan kondisi?
Javi

222

Anda harus mencoba menggunakan isinstance()

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

Dalam kasus Anda

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

Untuk menguraikan:

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: Perbedaan antara isinstance()dan type()dan mengapa isinstance()cara yang paling disukai untuk memeriksa adalah bahwa isinstance()memeriksa subkelas sebagai tambahan, sementara type()tidak.


22

Ini sepertinya bekerja untuk saya:

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


0

Meskipun tidak semudah yang isinstance(x, list)bisa digunakan juga:

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

dan aku agak suka kepintaran sederhana itu

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.