Kết hợp các câu trả lời của @jamylak và @ jpaddison3 với nhau, nếu bạn cần mạnh mẽ chống lại các mảng khó hiểu như đầu vào và xử lý chúng theo cách giống như danh sách, bạn nên sử dụng
import numpy as np
isinstance(P, (list, tuple, np.ndarray))
Điều này là mạnh mẽ chống lại các lớp con của danh sách, tuple và numpy mảng.
Và nếu bạn cũng muốn mạnh mẽ đối với tất cả các lớp con khác của chuỗi (không chỉ liệt kê và tuple), hãy sử dụng
import collections
import numpy as np
isinstance(P, (collections.Sequence, np.ndarray))
Tại sao bạn nên làm mọi thứ theo cách này isinstancevà không so sánh type(P)với giá trị mục tiêu? Dưới đây là một ví dụ, nơi chúng ta thực hiện và nghiên cứu hành vi của NewList, một lớp con tầm thường của danh sách.
>>> class NewList(list):
... isThisAList = '???'
...
>>> x = NewList([0,1])
>>> y = list([0,1])
>>> print x
[0, 1]
>>> print y
[0, 1]
>>> x==y
True
>>> type(x)
<class '__main__.NewList'>
>>> type(x) is list
False
>>> type(y) is list
True
>>> type(x).__name__
'NewList'
>>> isinstance(x, list)
True
Mặc dù xvà yso sánh như nhau, xử lý chúng typesẽ dẫn đến hành vi khác nhau. Tuy nhiên, vì xlà một thể hiện của một lớp con của list, sử dụng isinstance(x,list)cung cấp cho các hành vi mong muốn và xử lý xvà ytheo cách tương tự.
typechưa?