2

我了解 Python 内置类型具有“真实性”值,并且考虑了空字符串False,而考虑了任何非空字符串True

这是有道理的

我可以使用内置函数检查这一点bool

>>> bool("")
False

>>> bool("dog")
True

在使用条件句时,我也可以利用这些真实性值。例如:

>>> if "dog":
...     print("yes")
...
yes

这令人困惑

但是,这不适用于==操作员:

>>> "dog" == True
False

>>> "dog" == False
False

谁能解释为什么==似乎与有条件的行为不同?

4

3 回答 3

2

请参阅文档的真值测试比较部分,摘录如下。

简而言之,大多数事情在默认情况下都是真实的,这就是为什么bool("dog")是真实的。运算符比较两个对象的==相等性,而不是比较它们的真实性,正如我假设你所期望的那样。

4.1。真值测试

可以测试任何对象的真值,用于 if 或 while 条件或作为以下布尔运算的操作数。

默认情况下,一个对象被认为是真,除非它的类定义了一个__bool__()返回 False 的__len__()方法或一个返回零的方法,当与该对象一起调用时。

以下是大多数被认为是错误的内置对象:

  • 定义为假的常量:NoneFalse
  • 任何数字类型的零:0, 0.0, 0j, Decimal(0),Fraction(0, 1)
  • 空序列和集合:'', (), [], {}, set(),range(0)

除非另有说明,否则具有布尔结果的操作和内置函数始终返回 0 或 False 表示假,1 或 True 表示真。(重要的例外:布尔运算总是返回它们orand 操作数之一。)

4.3. 比较

不同类型的对象,除了不同的数值类型,永远不会比较相等。

...

__eq__()除非该类定义了方法,否则类的不同实例通常比较为不相等。

于 2018-02-28T04:38:03.730 回答
1

基础

我相信你的困惑可能来自于将 Python 与诸如 JavaScript 之类的有 a==和 a===运算符的语言进行比较。Python 不能以这种方式工作。

在 Python 中,比较相等性的唯一方法是 with ==,它比较值和类型。

因此,如果您 compare True == "dog",那么表达式是立即False的,因为类型boolstr不是可以比较的类型。

虽然,请注意,这并不意味着它们之间没有可比较的类型。例子是setfrozenset

frozenset({1,2,3}) == {1,2,3} # True

或者简单地intfloat

1 == 1.0 # True

这是大多数内置类型的行为。

优雅的部分

定义自己的类型的情况下,即定义类时,可以编写将__eq__类对象与另一个值进行比较时调用的 which。

例如,您可以这样做(顺便说一句,在评论中指出这是一个可怕的想法,您不应该继承内置类型)。

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 会退回到比较对象是否与.相同的对象is

于 2018-02-28T04:21:22.693 回答
0

当您比较时"dog" == True,您也在比较这些对象的类型,而不仅仅是它们的布尔值。

现在 as Truehas a typebool"dog"has a type str,根据==运算符,它们不等价,无论它们的布尔值是否相等。

注意:这里检查对象的类型和布尔值。

于 2018-02-28T04:16:28.867 回答