将@jamylak 和@jpaddison3 的答案结合在一起,如果您需要对 numpy 数组作为输入具有鲁棒性并以与列表相同的方式处理它们,您应该使用
import numpy as np
isinstance(P, (list, tuple, np.ndarray))
这对于列表、元组和 numpy 数组的子类是健壮的。
如果您还想对所有其他序列子类(不仅仅是列表和元组)保持健壮,请使用
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
, usingisinstance(x,list)
给出了所需的行为并以相同的方式对待x
和y
。