小编典典

使用isinstance比较boolean和int

python

有人可以给我一个解释,为什么isinstance()在以下情况下返回True?编写代码时,我期望为False。

print isinstance(True, (float, int))
True

我的猜测是,它的Python内部子类为零和一(无论是float还是int)都在用作布尔值时进行评估,但不知道确切的原因。

解决这种情况的最有效方法是什么?我可以使用,type()但在大多数情况下,这被认为不那么pythonic。


阅读 221

收藏
2021-01-20

共1个答案

小编典典

由于历史原因,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

  • 如果要检测其特定类恰好是floatint,拒绝子类的对象,则可以执行以下操作:

    if type(whatever) in (float, int):
    # Do stuff.
    
  • 如果要检测所有浮点数和整数,则已经在执行此操作。

2021-01-20