与Python中的布尔值进行比较

时间:2015-04-03 16:35:26

标签: python variables memory boolean

我已经看到它说,在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对象,所以为什么我们不应该这样做{ {1}}(或者这样做真的很好)?

另外,除了if x is True:是不必要的这一事实之外,我们有什么理由不做if x == True;如果是的话,你能给我一个关于记忆的描述吗?

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

2 个答案:

答案 0 :(得分:4)

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

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

  

值False和True将是单例,如None。因为   该类型有两个值,也许应该调用它们   " doubletons&#34 ;?真正的实施将不允许其他   要创建bool的实例。

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

答案 1 :(得分:2)

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

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

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

if bool(user_input) is True:

的可读性相当低。