Comparing boolean and int using isinstance(使用 isinstance 比较 boolean 和 int)
问题描述
有人能给我解释一下为什么 isinstance()
在以下情况下返回 True 吗?在编写代码时,我期望 False.
Can someone give me an explanation why isinstance()
returns True in the following case? I expected False, when writing the code.
print isinstance(True, (float, int))
True
我的猜测是它的 Python 的内部子类化,零和一 - 无论是浮点数还是整数 - 都在用作布尔值时进行评估,但不知道确切的原因.
My guess would be that its Python's internal subclassing, as zero and one - whether float or int - both evaluate when used as boolean, but don't know the exact reason.
解决这种情况的最pythonic方法是什么?我可以使用 type()
但在大多数情况下,这被认为不那么 Pythonic.
What would be the most pythonic way to solve such a situation? I could use type()
but in most cases this is considered less pythonic.
推荐答案
由于历史原因,bool
是 int
的子类,所以 True
是 int
的一个实例.(最初,Python 没有 bool 类型,返回真值的东西返回 1 或 0.当他们添加 bool
时,True 和 False 必须尽可能地替换 1 和 0 以实现向后兼容性,因此是子类化.)
For historic reasons, bool
is a subclass of int
, so True
is an instance of int
. (Originally, Python had no bool type, and things that returned truth values returned 1 or 0. When they added bool
, True and False had to be drop-in replacements for 1 and 0 as much as possible for backward compatibility, hence the subclassing.)
解决"这个问题的正确方法取决于您认为问题是什么.
The correct way to "solve" this depends on exactly what you consider the problem to be.
- 如果你想让
True
不再是int
,那太糟糕了.这不会发生. 如果您想检测布尔值并以不同于其他整数的方式处理它们,您可以这样做:
- If you want
True
to stop being anint
, well, too bad. That's not going to happen. If you want to detect booleans and handle them differently from other ints, you can do that:
if isinstance(whatever, bool):
# special handling
elif isinstance(whatever, (float, int)):
# other handling
如果你想检测特定类正好是float
或int
的对象,拒绝子类,你可以这样做:
If you want to detect objects whose specific class is exactly float
or int
, rejecting subclasses, you can do that:
if type(whatever) in (float, int):
# Do stuff.
这篇关于使用 isinstance 比较 boolean 和 int的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:使用 isinstance 比较 boolean 和 int


- ";find_element_by_name(';name';)";和&QOOT;FIND_ELEMENT(BY NAME,';NAME';)";之间有什么区别? 2022-01-01
- YouTube API v3 返回截断的观看记录 2022-01-01
- 计算测试数量的Python单元测试 2022-01-01
- 使用公司代理使Python3.x Slack(松弛客户端) 2022-01-01
- 检查具有纬度和经度的地理点是否在 shapefile 中 2022-01-01
- 如何使用PYSPARK从Spark获得批次行 2022-01-01
- 使用 Cython 将 Python 链接到共享库 2022-01-01
- 我如何卸载 PyTorch? 2022-01-01
- CTR 中的 AES 如何用于 Python 和 PyCrypto? 2022-01-01
- 我如何透明地重定向一个Python导入? 2022-01-01