【问题标题】:Comparisons with boolean values in Python [duplicate]与 Python 中的布尔值的比较 [重复]
【发布时间】:2015-04-03 16:35:26
【问题描述】:

我看到有人说,在 Python 中,与布尔值的比较应该是 if x: 的形式,而不是 if x == True:,当然也不是 if x is True: 的形式。

>>> 
>>> id(True)
505509720
>>> a = True
>>> id(a)
505509720
>>> random_string_to_reference_a_different_area_of_memory = "Python"
>>> id(True)
505509720
>>>

玩弄变量并查看内存位置(见上文),在我看来只有一个 True 和一个 False 对象,所以我们为什么不应该这样做 if x is True:(或者是这样做真的很好)?

另外,除了== True 是不必要的,我们还有什么理由不应该做if x == True;如果是这样,你能从记忆的角度给我一个描述吗?

我个人觉得使用is 比使用== 更合适,因为当我们进行比较时,看起来我们实际上是在查看一个变量是指向True 还是False 对象。谁能给我解释一下什么是最好的,为什么,以及它是如何运作的?

【问题讨论】:

  • 大概当你说你已经“看到它说”时,你的意思是python.org/dev/peps/pep-0008/#programming-recommendations?此外,“它是如何工作的” 对于 SO 问题来说过于宽泛。
  • TrueFalse 的 id 看起来 是一致的,并不意味着它们就一定是一致的。
  • 仅供参考,查看两个对象 ID 而没有这些对象同时处于活动状态是毫无意义的。旧的可能已被垃圾收集,导致新的重用其内存位置。
  • @MarkRansom 不过对他们来说是有道理的。我看看能不能在网上找到答案。

标签: python variables memory boolean


【解决方案1】:

您也不应该使用== True== False,除非您明确需要针对布尔值进行测试(您几乎从不这样做)。在 Python 中执行布尔测试的首选方法是 if fooif not foo

但是,从技术角度来看,使用is Trueis False 并没有错。在PEP 285(定义了bool类型)中:

值 False 和 True 将是单例,例如 None。因为 该类型有两个值,也许应该调用这些值 “双胞胎”?真正的实现不会允许其他 要创建的 bool 实例。

因此,无论何时使用 TrueFalse,您最终都会得到相同的实例。

【讨论】:

  • 这只是is== 语言中引入的简写吗?
  • 我不知道语言专门将TrueFalse 定义为单例。为此 +1。
  • 其实是另一回事。 x is True 测试x 是否实际上与True 相同,因此只有实际的True 才能满足此测试。 x == True 也将接受 x 作为包含例如的类的实例。 __eq__(self, other): return True。如果您只是测试xnot x,您只需检查值是“真”还是“假”——例如,空集合是假的。
  • 我明白了。因此为什么1 == TrueTrue,但1 is TrueFalse(因为1 是“真实的”但与单例True 不同(不存储在相同的内存位置))。但我认为if x:if x == True: 完全一样,我是正确的,不是吗?
  • 你不是。 if x 测试真实性。例如,x = [0] 是真实的,但不是 == True1 == True 为 true 的原因在于 boolint 的子类,而 True 的值为 1False 的值为 0
【解决方案2】:

您不使用x is <True/False>x == <True/False> 的一个原因是您并不总是测试TrueFalse。取以下代码:

user_input = raw_input(' > ')
if user_input:
    ...

如果您执行user_input is Trueuser_input == True,这将无法正常工作,它们都不会评估真值。还有很多其他的例子,truth-y and false-y objects 应该和TrueFalse 本身一样可以接受,例如

if bool(user_input) is True:

可读性较差。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    相关资源
    最近更新 更多