ตรวจสอบว่าพิมพ์รายการ == ในหลาม


185

ฉันอาจมีสมองผายลมที่นี่ แต่ฉันไม่สามารถเข้าใจได้ว่ามีอะไรผิดปกติกับรหัสของฉัน:

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

เอาท์พุทเป็น<type 'list'>แต่คำสั่ง if ไม่เคยเรียก ทุกคนสามารถสังเกตเห็นข้อผิดพลาดของฉันที่นี่ได้ไหม?


3
คุณเคยใช้listเป็นตัวแปรที่ไหนสักแห่ง? ระวังว่าถ้าคุณกำลังทำงานใน REPL หรืออาจจะยังคงถูกกำหนดใหม่เมื่อไม่นานมานี้
Ffisegydd

..... Woooowww ... เป็นบทเรียนเกี่ยวกับข้อบกพร่องของภาษาที่พิมพ์อย่างนุ่มนวล ว้าว ...
Benjamin Lindqvist

เพิ่มเป็นคำตอบและฉันจะยอมรับ ขอบคุณ
Benjamin Lindqvist

1
ไพลินท์และเพื่อน ๆ จะช่วยคุณในอนาคต (ฉันจะไม่เรียกสิ่งนี้ว่าข้อบกพร่องจริง ๆ )

คำตอบ:


140

ปัญหาของคุณคือคุณได้กำหนดlistตัวแปรเป็นรหัสก่อนหน้านี้อีกครั้ง ซึ่งหมายความว่าเมื่อคุณทำtype(tmpDict[key])==listหากจะกลับมาFalseเพราะพวกเขาไม่เท่ากัน

ที่ถูกกล่าวว่าคุณควรใช้isinstance(tmpDict[key], list)เมื่อทดสอบประเภทของสิ่งนี้จะไม่หลีกเลี่ยงปัญหาของการเขียนทับlistแต่เป็นวิธีการตรวจสอบประเภท Pythonic


ดี 'more Pythonic' เป็นแนวคิดที่กว้าง เพียงเพื่อประโยชน์ของการศึกษา: อะไรคือความแตกต่างระหว่างประเภทและ isinstance?
Javi

222

คุณควรลองใช้ isinstance()

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

ในกรณีของคุณ

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

ทำอย่างละเอียด:

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"

แก้ไข 1: ความแตกต่างระหว่างisinstance()และtype()กับสาเหตุisinstance()ที่ทำให้วิธีการตรวจสอบที่ต้องการมากที่สุดคือการisinstance()ตรวจสอบคลาสย่อยนอกจากนี้ในขณะที่type()ไม่


22

ดูเหมือนว่าจะใช้งานได้สำหรับฉัน:

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


0

แม้ว่าจะไม่ตรงไปตรงมาเท่าที่isinstance(x, list)สามารถใช้ได้เช่นกัน:

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

และฉันก็เป็นเหมือนความฉลาดเรียบง่ายของสิ่งนั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.