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?

Benjamin Lindqvist
sumber
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.

Ffisegydd
sumber
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.

d-coder
sumber
22

Ini sepertinya bekerja untuk saya:

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

Python 3.7.7

import typing
if isinstance([1, 2, 3, 4, 5] , typing.List):
    print("It is a list")
Aravind Krishnakumar
sumber
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

remigiusz boguszewicz
sumber