Поєднуючи відповіді @jamylak та @ jpaddison3 разом, якщо вам потрібно бути надійними проти масивних масивів як вхідних даних і обробляти їх так само, як і списки, слід використовувати
import numpy as np
isinstance(P, (list, tuple, np.ndarray))
Це надійно щодо підкласів масивів списку, кортежу та нумеру.
І якщо ви хочете бути надійними щодо всіх інших підкласів послідовності (а не лише списку та кортежу), використовуйте
import collections
import numpy as np
isinstance(P, (collections.Sequence, np.ndarray))
Чому слід робити такі дії, isinstanceа не порівнювати їх type(P)із цільовим значенням? Ось приклад, де ми складаємо та вивчаємо поведінку NewListтривіального підкласу списку.
>>> 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
Незважаючи на порівняння xта yпорівняння з рівними, поводження з ними typeпризведе до різної поведінки. Однак, оскільки xє екземпляром підкласу list, використання isinstance(x,list)дає бажану поведінку та трактує xі yтаким же чином.
type?