使用isinstance比较boolean和int
问题内容:
有人可以给我一个解释,为什么isinstance()
在以下情况下返回True?编写代码时,我期望为False。
print isinstance(True, (float, int))
True
我的猜测是,它的Python内部子类为零和一(无论是float还是int)都在用作布尔值时进行评估,但不知道确切的原因。
解决这种情况的最有效方法是什么?我可以使用,type()
但在大多数情况下,这被认为不那么pythonic。
问题答案:
由于历史原因,bool
是的子类int
,所以True
是的实例int
。(最初,Python没有布尔类型,返回真值的东西返回1或0。添加它们时bool
,必须将True和False尽可能多地替换为1和0,以实现向后兼容性,因此是子类。
)
解决此问题的正确方法取决于您所认为的问题所在。
- 如果您不想
True
再成为一个int
太糟糕了。那不会发生。 -
如果要检测布尔值并以不同于其他int的方式处理它们,则可以执行以下操作:
if isinstance(whatever, bool): # special handling
elif isinstance(whatever, (float, int)):
# other handling -
如果要检测其特定类恰好是
float
或int
,拒绝子类的对象,则可以执行以下操作:if type(whatever) in (float, int): # Do stuff.
-
如果要检测所有浮点数和整数,则已经在执行此操作。