【问题标题】:Is there only one True and one False object in Python?Python 中是否只有一个 True 和一个 False 对象?
【发布时间】:2014-07-19 17:05:03
【问题描述】:

我知道 Python 保证只有一个 NoneType 实例,即 None 对象,因此您可以安全地使用 is None 来测试是否等于 None

bool TrueFalse 是否有同等的保证(即每个只有一个实例)?

如果没有,为什么不呢?

编辑:特别是,我注意到(n+0) is (0+n)range(-5, 257)False 中为n 提供True,否则为False。换句话说,零、前 256 个正整数和前 5 个负整数似乎是预先缓存的,不会再次实例化。我猜这是解释器的选择(在我的例子中是 CPython),而不是语言的规范。而bool 源自int,所以我仍然想知道我对其他口译员有什么期望。

编辑:澄清一下,因为这似乎产生了很多混乱,我的意图是来测试一个值的布尔解释。为此,我永远不会使用is Trueis False。我的意图是能够将False 与其他所有内容区分开来,在一个变量中,该变量可以具有多种类型的值,包括空字符串、零和None,对于True 也是如此。我自己是一位经验丰富的程序员,当我看到“if booleanvar == True”时会畏缩。

关于重复的注意事项: 据称此问题与(thisthis)重复的问题不回答此问题;他们只是声明boolint 的子类,主要区别在于repr,而不是TrueFalse 保证是唯一的。

另外,请注意,这不是关于TrueFalse名称 绑定的问题,而是关于bool 类的实例 .

【问题讨论】:

  • 您为什么需要/想要这样做?与if var: 相比,if var is True: 这样的东西很难看。
  • 一般来说:不要针对TrueFalse 进行测试。改为使用表达式的隐式布尔值。
  • 1.这取决于哪个版本的 Python;和 2. 永远不要依赖这个(根据PEP-0008“是:if greeting:,否:if greeting == True:,更糟糕的是:if greeting is True:)。
  • @PedroGimeno:我强烈建议你不要使用is Trueis False。您将改用if something:,并且not 测试True 或False。如果你必须有一个布尔值,最好使用isinstance(object, bool)
  • 内置名称TrueFalse是单例。

标签: python object boolean instance


【解决方案1】:

来自文档 (https://docs.python.org/2/reference/datamodel.html#the-standard-type-hierarchy):

布尔值

这些代表真值 False 和 True。表示 False 和 True 值的两个对象是唯一的布尔对象。

只有两个对象,任何产生布尔值的计算都会产生这两个现有对象之一:

>>> (1 == 1) is True
True
>>> (1 == 0) is False
True

【讨论】:

  • 谢谢,这正是我一直在寻找的答案,得到了规范来源的支持。
【解决方案2】:

bool 类型只有两个实例,TrueFalse。此外,它不能被子类化,因此无法创建可以具有额外实例的派生类。

但即使有保证,也很少有充分的理由依赖它。您通常应该使用if x 而不是if x is True,并避免需要将True 与其他真值或False 与其他假值区分开来的情况。

【讨论】:

  • 但有时你通过执行计算生成实例;例如(917+543) is (916+544)False。那么我是否可以保证如果我产生 False 或 True,我不会有新的实例?从你的回答中看不清楚。
  • @PedroGimeno 您正在比较两个整数并询问它们是否是相同的引用。与您的问题中的布尔值无关。如果你在这些整数上调用 bool,你会得到你期望的结果。 >>> bool(917+543) is bool(916+544)True
  • @JoshSmeaton:我的问题是关于实例的。对于is,我在问它们是否是同一个实例。我使用了int 示例,因为boolint 的子类。请查看我最近对我的问题所做的修改。
猜你喜欢
  • 2018-07-01
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-21
  • 1970-01-01
相关资源
最近更新 更多