我知道Python内置类型具有“真实性”值,空字符串被视为False
,而任何非空字符串都被视为True
。
我可以使用内置函数bool
检查这一点。
>>> bool("")
False
>>> bool("dog")
True
使用条件时,我也可以使用这些真值。例如:
>>> if "dog":
... print("yes")
...
yes
但这不适用于==
运算符:
>>> "dog" == True
False
>>> "dog" == False
False
有人可以解释为什么==
的行为似乎与条件不同?
答案 0 :(得分:2)
请参阅文档的truth value testing和comparisons部分,摘录如下。
简而言之,默认情况下,大多数事情都是真实的,这就是bool("dog")
为真的原因。 ==
运算符比较两个对象是否相等,而不是比较它们的真实性,正如我假设你所期望的那样。
<强> 4.1。真值测试
可以测试任何对象的真值,用于if或while条件或下面布尔运算的操作数。
默认情况下,除非其类定义,否则将对象视为true 返回False的
__bool__()
方法或__len__()
方法 当使用对象调用时返回零。以下是大多数被认为是错误的内置对象:
- 常量定义为false:
None
和False
- 任何数字类型的零:
0
,0.0
,0j
,Decimal(0)
,Fraction(0, 1)
- 空序列和集合:
''
,()
,[]
,{}
,set()
,range(0)
始终具有布尔结果的操作和内置函数 除非另有说明,否则返回0或False表示false,1表示True或True表示true 说明。 (重要的例外:布尔运算
or
和and
总是返回他们的一个操作数。)<强> 4.3。比较强>
不同类型的对象,除了不同的数字类型,从不 比较平等。
...
类的非相同实例通常比较为不相等 除非该类定义了
__eq__()
方法。
答案 1 :(得分:1)
我相信您的混淆可能来自于将Python与JavaScript等语言进行比较,其中有==
和===
运算符。 Python不会这样工作。
在Python中,比较相等性的唯一方法是==
,这比较了值和类型。
因此,如果您比较True == "dog"
,则表达式会立即False
,因为类型bool
和str
不是可以比较的类型。
虽然,但请注意,这并不意味着他们之间没有可比较的类型。示例包括set
和frozenset
:
frozenset({1,2,3}) == {1,2,3} # True
或只是int
和float
1 == 1.0 # True
这是大多数内置类型的行为。
如果定义自己的类型,即在定义类时,可以编写将类对象与另一个值进行比较时调用的__eq__
。
通过示例,您可以这样做(顺便说一下,在评论中指出这是一个可怕的想法,你不应该继承内置类型)。
class WeirdString(str):
def __eq__(self, other):
return str(self) == str(other) or bool(self) == bool(other)
s = WeirdString("dog")
s == True # True
如果您没有定义__eq__
,那么Python会依靠比较对象是否与<{1}} 相同的对象。
答案 2 :(得分:0)
比较
"dog" == True
时,您还要比较这些对象的类型,而不仅仅是它们的布尔值。
现在,True
类型为bool
而"dog"
类型为str
,根据==
运算符,它们不相同,无论它们是什么布尔值相等。
注意:此处正在检查对象的类型,布尔值。