理解字符串的真实性

Understanding the truthiness of strings

我知道 Python 内置类型有一个 "truthiness" 值,空字符串被认为是 False,而任何非空字符串都被认为是 True.

这是有道理的

我可以使用内置函数 bool 进行检查。

>>> bool("")
False

>>> bool("dog")
True

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

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

这令人困惑

虽然这不适用于 == 运算符:

>>> "dog" == True
False

>>> "dog" == False
False

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

When you compare "dog" == True, you are also comparing the type of these objects and not just their boolean value.

现在 True 的类型为 bool"dog" 的类型为 str,根据 == 运算符,它们不等价,无论他们的布尔值相等。

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

基础知识

我相信您的困惑可能来自将 Python 与 JavaScript 等语言进行比较,其中有一个 == 和一个 === 运算符。 Python 这样不行。

在 Python 中,比较相等性的唯一方法是使用 ==,这会同时比较值和类型。

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

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

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

或者简单地 intfloat

1 == 1.0 # True

这是大多数 built-in 类型的行为。

classy 部分

在您定义自己的类型的情况下,即当您定义classes时,您可以编写__eq__,当您将 class 对象与另一个值进行比较。

举例来说,你可以这样做(顺便说一下,评论中指出这是一个糟糕的主意,你不应该继承 built-in 类型)。

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 将返回比较对象是否 相同的对象 和 [=26] =].

请参阅文档的 truth value testing and comparisons 部分,摘录如下。

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

4.1. Truth Value Testing

Any object can be tested for truth value, for use in an if or while condition or as operand of the Boolean operations below.

By default, an object is considered true unless its class defines either a __bool__() method that returns False or a __len__() method that returns zero, when called with the object.

Here are most of the built-in objects considered false:

  • constants defined to be false: None and False
  • zero of any numeric type: 0, 0.0, 0j, Decimal(0), Fraction(0, 1)
  • empty sequences and collections: '', (), [], {}, set(), range(0)

Operations and built-in functions that have a Boolean result always return 0 or False for false and 1 or True for true, unless otherwise stated. (Important exception: the Boolean operations or and and always return one of their operands.)

4.3. Comparisons

Objects of different types, except different numeric types, never compare equal.

...

Non-identical instances of a class normally compare as non-equal unless the class defines the __eq__() method.