Поєднуючи відповіді @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
?