Kiểm tra nếu loại == danh sách trong python


185

Tôi có thể bị rắm não ở đây, nhưng tôi thực sự không thể tìm ra điều gì sai với mã của mình:

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

đầu ra là <type 'list'>nhưng câu lệnh if không bao giờ kích hoạt. Bất cứ ai có thể phát hiện ra lỗi của tôi ở đây?


3
Bạn đã sử dụng listnhư một biến ở đâu đó? Xin lưu ý rằng nếu bạn đang làm việc trong REPL hoặc như vậy thì nó vẫn có thể được xác định lại từ một thời gian trước.
Ffisegydd

..... Woooowww ... chắc chắn là một bài học liên quan đến những thiếu sót của các ngôn ngữ được gõ nhẹ. Wow ...
Benjamin Lindqvist

Thêm nó dưới dạng câu trả lời và tôi sẽ chấp nhận. CẢM ƠN.
Benjamin Lindqvist

1
Pylint và bạn bè sẽ giúp bạn trong tương lai (tôi thực sự sẽ không gọi đây là một thiếu sót).

Câu trả lời:


140

Vấn đề của bạn là bạn đã xác định lại listnhư một biến trước đây trong mã của mình. Điều này có nghĩa là khi bạn làm type(tmpDict[key])==listnếu sẽ quay lại Falsevì chúng không bằng nhau.

Điều đó đang được nói, thay vào đó, bạn nên sử dụng isinstance(tmpDict[key], list)khi kiểm tra loại của một cái gì đó, điều này sẽ không tránh được vấn đề ghi đè listnhưng là một cách kiểm tra loại Pythonic hơn.


Đẹp. "Thêm Pythonic" là một khái niệm rộng. chỉ vì lợi ích của giáo dục: những gì là khác biệt giữa loại và đẳng cấp?
Javi

222

Bạn nên thử sử dụng isinstance()

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

Trong trường hợp của bạn

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

Để giải thích:

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: Sự khác biệt giữa isinstance()type()tại sao isinstance()cách kiểm tra ưa thích nhất là isinstance()kiểm tra thêm các lớp con, trong khi type()không.


22

Điều này dường như làm việc cho tôi:

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


0

Mặc dù không đơn giản như isinstance(x, list)người ta có thể sử dụng là tốt:

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

và tôi giống như sự thông minh đơn giản của điều đó

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.