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.