为什么在Python中1 == True但是2!= True?

Clu*_*ess 30 python

可能重复:
在Python中False == 0和True == 1是一个实现细节还是由语言保证?

我的交互式控制台的简短记录:

Python 2.7.2 (default, Jun 29 2011, 11:10:00) 
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> True
True
>>> 0 == True
False
>>> 1 == True
True
>>> 2 == True
False
Run Code Online (Sandbox Code Playgroud)

这究竟是为什么呢?

编辑:为了对比起见,请考虑is操作员.

>>> 0 is False
False
>>> 1 is True
False
>>> 0 is 0
True
>>> True is True
True
Run Code Online (Sandbox Code Playgroud)

这使得有很大的意义,因为虽然1和True都意味着同样的事,作为一个条件if语句,他们真的是不一样的东西.

再次编辑:更有趣的后果1 == True:

>>> d = {}
>>> d[True] = "hello"
>>> d[1]
"hello"
Run Code Online (Sandbox Code Playgroud)

Dat*_*jam 35

因为Python中的布尔值是整数的子类型.从文档:

布尔值是两个常量对象False和True.它们用于表示真值(尽管其他值也可以被认为是假或真).在数字上下文中(例如,当用作算术运算符的参数时),它们的行为分别与整数0和1相似.如果值可以被解释为真值,则内置函数bool()可用于将任何值强制转换为布尔值(请参阅上面的真值测试部分).

http://docs.python.org/library/stdtypes.html#boolean-values

  • @Clueless:小心`is`,因为*整数*有时彼此不相等,或者:[Python"是"运算符与整数一起意外行为](http://stackoverflow.com/questions/306313/python-是运营商 - 行为 - 意外与 - 整数) (9认同)
  • @Clueless Python _chose_的设计者允许一种类型的值表现为另一种类型的值,看起来更频繁.Python不像Java,其中布尔值和整数不可隐式地互换.也就是说,当需要"分离"时,你可以使用[Python的内置`type`函数](http://docs.python.org/library/functions.html#type). (2认同)

Pab*_*ruz 27

因为实例bool也是intpython中的实例.True碰巧等于整数1.

看看这个例子:

[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> isinstance(True, int)
True
>>> int(True)
1
>>> 
Run Code Online (Sandbox Code Playgroud)


ham*_*mar 12

曾几何时(在Python <2.3中),没有布尔类型,没有False或True只有0和1.然后PEP 285出现,因此他们被添加到语言中.它们的定义是这样的,True == 1并且False == 0可能出于向后兼容的原因.


mac*_*ing 11

它是标准的二进制约定:1为真,0为假.

它就像1表示机器语言中的"on",0表示"off".

因此,bool类型只是intPython中的一个子类型,带有1 == True和0 == False.

但是,任何非零数值都将True在条件语句中进行求值:

>>> if 2: print "ok"
ok
>>> 2 == True
False
Run Code Online (Sandbox Code Playgroud)


Ros*_*son 5

相等测试与布尔测试不同:

>>> bool(1)
True
>>> bool(2)
True
>>> bool(-1)
True
>>> bool(0)
False
Run Code Online (Sandbox Code Playgroud)

  • @Clueless 但是,如果您允许这样做,您可以“证明”`1==2`,因为您希望相等运算是可传递的(因此`1 == True == 2`)。现在这也很不一致,而且问题更多 imo ;) (3认同)