代码之家  ›  专栏  ›  技术社区  ›  Dustin Michels

理解字符串的真实性

  •  2
  • Dustin Michels  · 技术社区  · 7 年前

    我知道Python内置类型有一个“truthiness”值,并且考虑空字符串 False ,而考虑任何非空字符串 True .

    这很有道理

    我可以使用内置功能检查 bool .

    >>> bool("")
    False
    
    >>> bool("dog")
    True
    

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

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

    这让人困惑

    这不适用于 == 尽管操作员:

    >>> "dog" == True
    False
    
    >>> "dog" == False
    False
    

    有人能解释一下原因吗 == 似乎与有条件的行为不同?

    3 回复  |  直到 4 年前
        1
  •  2
  •   MarredCheese Lionia Vasilev    7 年前

    请参见 truth value testing comparisons 本文件各节节选如下。

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

    4.1. 真值检验

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

    默认情况下,除非对象的类定义 要么是a __bool__() 返回False或 __len__() 方法 当使用对象调用时,返回零。

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

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

    始终具有布尔结果的操作和内置函数 除非另有说明,否则返回0或False表示False,返回1或True表示True 规定的。(重要例外:布尔运算 or and 始终返回其中一个操作数。)

    4.3. 比较

    不同类型的对象(不同的数字类型除外)从不 比较相等。

    ...

    类的不相同实例通常比较为不相等 除非类定义 __eq__() 方法

        2
  •  1
  •   Olivier Melançon iacob    7 年前

    基础知识

    我相信您的困惑可能来自于将Python与JavaScript等语言进行比较 == 和a === 操作人员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
    

    如果您没有定义 __均衡器__ ,则Python会再次比较对象是否 同一对象 具有 is .

        3
  •  0
  •   Ubdus Samad    7 年前

    当你比较 "dog" == True ,您还可以比较这些对象的类型,而不仅仅是它们的布尔值。

    现在作为 True 具有类型 bool "dog" 具有类型 str ,根据 == 运算符,而不管其布尔值是否相等。

    注意:此处将检查对象的类型和布尔值。