理解python字符串的真实性

时间:2018-02-28 04:09:52

标签: python python-3.x boolean truthiness

我知道Python内置类型具有“真实性”值,空字符串被视为False,而任何非空字符串都被视为True

这是有道理的

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

>>> bool("")
False

>>> bool("dog")
True

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

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

这令人困惑

但这不适用于==运算符:

>>> "dog" == True
False

>>> "dog" == False
False

有人可以解释为什么==的行为似乎与条件不同?

3 个答案:

答案 0 :(得分:2)

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

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

  

<强> 4.1。真值测试

     

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

     

默认情况下,除非其类定义,否则将对象视为true   返回False的__bool__()方法或__len__()方法   当使用对象调用时返回零。

     

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

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

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

     

<强> 4.3。比较

     

不同类型的对象,除了不同的数字类型,从不   比较平等。

     

...

     

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

答案 1 :(得分:1)

基础知识

我相信您的混淆可能来自于将Python与JavaScript等语言进行比较,其中有=====运算符。 Python不会这样工作。

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

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

虽然,但请注意,这并不意味着他们之间没有可比较的类型。示例包括setfrozenset

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

或只是intfloat

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,根据==运算符,它们不相同,无论它们是什么布尔值相等。

注意:此处正在检查对象的类型,布尔值。