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=()
,它是空元组。它的真值为falsea
是一个单成员元组,其计算结果为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