Python 既不真实也不虚假的事物

Python 既不真实也不虚假的事物,python,boolean,Python,Boolean,我刚刚发现: a = (None,) print (a is True) print (a is False) print (a == True) print (a == False) print (a == None) print (a is None) if a : print "hello" if not a : print "goodbye" 产生: False False False False False False hello 因此,a既不为真,也不等于真,也不等于假,但在if

我刚刚发现:

a = (None,)
print (a is True)
print (a is False)
print (a == True)
print (a == False)
print (a == None)
print (a is None)
if a : print "hello"
if not a : print "goodbye"
产生:

False
False
False
False
False
False
hello
因此,a既不为真,也不等于真,也不等于假,但在if语句中充当真

为什么?

更新:

事实上,我刚刚意识到这并不像我想的那么模糊。对于a=2,我也得到了相同的结果(虽然对于a=0或a=1,它们分别被认为等于False和True),因为a=0或a=1是一个包含元素的元组,它不是空的,因此在该上下文中不会计算为False。

因为
a=(None,)
是一个包含单个元素的元组
None

使用
a=None重试,您将看到不同的结果


还可以尝试
a=()
,它是空元组。它的真值为false

a
是一个单成员元组,其计算结果为
True
对象的测试标识,因此,在所有这些测试中都会得到
False
=
测试对象的相等性,因此,再次得到
False

在用于计算对象的
if
语句中,对于非空元组,它应该返回
True
,因此得到
True
。希望这能回答你的问题


edit:之所以
True
False
分别等于
1
0
,是因为
bool
类型是作为
int
类型的子类实现的。

在Python中,通过使用
bool()
函数或

示例:

  • 序列(列表、字符串等)为空时将转换为
    False
  • 当整数等于0时,它们将转换为
    False
  • 您可以在自己的类中通过重写
    \uuuu nonzero\uuuu()
    来定义此行为
[编辑]


在代码中,使用
if
语句中的
bool()
转换元组
(None,)
。因为它不是空的,所以它的计算结果为
True

我发现这里几乎所有的解释都没有帮助,所以这里是另一个尝试:

这里的混淆是基于“是”、“如果”和“如果”是三个不同的测试

  • “是”测试身份,也就是说,如果它是同一个对象。在这种情况下,这显然不是事实
  • “==”测试值是否相等,显然,只有值为True和False的内置对象是对象True和False(任何数字类型的数字0和1除外)
下面是重要的部分:

  • “if”测试布尔值。这意味着无论你给它什么表达式,它都将被转换为True或False。您可以使用bool()进行同样的操作。bool((None,))将返回True。文档中列出了将评估为False的内容(此处由其他人链接)

现在也许这在我的脑海里更清晰了,但至少我试过了。:)

python中的内容不必是
True
False

当它们被用作
if
/
的文本表达式,而
循环时,它们被转换为布尔值。您不能使用
is
==
来测试它们的计算结果。你用
bool(东西)

另请注意:

>>> 10 == True
False
>>> 10 is True
False
>>> bool(10)
True
TL;博士:

如果
=
是完全不同的操作。
if
检查变量的真值,而
=
比较两个变量<代码>is
还比较两个变量,但如果两个变量都引用同一对象,则会进行比较

因此,将变量与
True
False
None
进行比较以检查其真值是没有意义的

如果对变量使用
,会发生什么情况?
在Python中,类似于
if
的检查隐式获取参数的
bool
。所以

if something:
将(在发动机罩下)执行如下操作:

if bool(something):
请注意,您不应该在代码中使用后者,因为它被认为不太像Python,而且速度较慢(因为Python随后使用两个
bool
s:
bool(bool(something))
如果出现问题,请始终使用

如果您对CPython 3.6如何评估它感兴趣:

请注意,CPython在这里并不完全使用hasattr。它会检查
x
type
是否实现了该方法,但没有经过
\uuu getattribute\uuuu
方法(
hasattr
将使用该方法)

在Python2中,该方法被称为
\uuuu nonzero\uuu
而不是
\uuuu bool\uu

使用
==
比较变量时会发生什么情况?
==
将检查是否相等(通常也称为“值相等”)。但是,此相等性检查不会强制操作数(与其他编程语言不同)。Python中的值相等是显式实现的。因此,您可以:

>>> 1 == True  # because bool subclasses int, True is equal to 1 (and False to 0)
True

>>> 1.0 == True  # because float implements __eq__ with int
True

>>> 1+1j == True  # because complex implements __eq__ with int
True
但是,如果两个操作数都没有实现比较,
=
将默认为引用比较(
)。这就是为什么:

>>> (None, ) == True
False
因为
tuple
不“支持”与
int
相等,反之亦然。请注意,即使将列表与元组进行比较也“不受支持”:

以防您感兴趣,这是CPython(3.6)实现相等的方式(橙色箭头指示操作是否返回
NotImplemented
常量):

这仅仅是大致正确的,因为CPython还检查
value1
value2
type()
是否实现了
\uuuuuueq\uuuuu
(无需通过
\uGetAttribute\uuuuu
方法!),然后调用(如果存在)或跳过(如果不存在)

请注意,Python2中的行为要长得多(至少如果
>>> (None, ) == True
False
>>> [None] == (None, )
False
>>> 1 is 1.  # same value, different types
False

>>> a = 500
>>> a is 500  # same value, same type, different instances
False