【问题标题】:if x:, vs if x == True, vs if x is Trueif x:, vs if x == True, vs if x is True
【发布时间】:2013-12-23 15:06:11
【问题描述】:

抱歉,如果以前有人问过这个问题,但我徒劳地寻找我的 exact 问题的答案。基本上,使用 Python 2.7,我有一个运行一系列地理处理工具的程序,这取决于用户在脚本中调整的一系列 True/False 变量所要求的内容,例如

x = True

if x:
    run function

但是,我现在发现 x 不需要是字面上的“真”,函数才能运行。例如:

In: x = True
    if x:
        print True

Out: True

In: x = 123
    if x:
        print True

Out: True

In: x = 'False'
    if x:
        print True

Out: True

In: x = False
    if x:
        print True

Out: 

因此,除 False 之外的任何值似乎都会评估为 True,而如果 x == Truex 为 True 则不会出现这种情况。鉴于 PEP 8 强烈建议仅使用 if x: 变体,任何人都可以解释为什么会发生这种行为吗?似乎 if x: 更像是对“如果 x 不是 False”或“如果 x 存在”的测试。考虑到这一点,我相信我应该使用 if x is True: 在这种情况下,不管 PEP 8 怎么说。

【问题讨论】:

    标签: python if-statement boolean


    【解决方案1】:
    x = 'False'
    x = 123
    

    都是True

    Other truth values.

    该文档解释了其他值。

    就 PEP8 的原因而言,阅读 if this_file_is_green 的语义要多得多

    【讨论】:

    • +1 链接,没有意识到,我一直在查看 Python 较旧版本的教程,但没有这么多细节。
    【解决方案2】:

    其他虚假值包括0''[]。您应该只使用if x: 版本。

    【讨论】:

      【解决方案3】:

      以下 Python 中的值在 if 和其他逻辑上下文的上下文中为 false:

      • False
      • None
      • 数值等于0,如00.0-0.0
      • 空字符串:''u''
      • 空容器(例如列表、元组和字典)
      • 任何实现__bool__(在Python3中)返回False,或__nonzero__(在Python2中)返回False0的东西。
      • 任何未实现 __bool__(在 Python3 中)或 __nonzero__(在 Python2 中),但实现 __len__ 以返回等于 0 的值

      如果其中任何一个适用,则将对象视为“假”,否则视为“真”,无论它实际上是否等于或等同于 FalseTrue

      现在,如果您已经安排 x 必然是 TrueFalse 对象之一,那么您可以放心地编写 if x。如果您已经安排x 的“真实性”指示是否执行操作,无论类型如何,那么您可以放心地编写if x。你可以在哪里写你应该更喜欢这样做,因为它更容易阅读。

      通常,如果允许x 取值True,那么您处于这两种情况之一,因此您不会写if x is True。重要的是正确记录x 的含义,以便它反映代码中使用的测试。

      Python 程序员应该知道什么被认为是真的,所以如果你只是记录,“如果x 为真,则运行函数”,那么这表达了你的原始代码的作用。记录它,“如果x is True 运行函数”将有不同的含义,并且不太常用,因为 PEP8 中的样式规则说测试真实性而不是特定值True

      但是,如果您希望代码在x 是空容器的情况下与None 情况下的行为不同,那么您可以编写类似if x is not None 的内容。

      【讨论】:

      • 感谢您的详细解释。在我的例子中,虽然我只希望用户使用 True 或 False,而没有其他值,但代码的文档足以遵循 PEP 8 并保留我的 if x: 语句。
      【解决方案4】:

      说话的能力

      if x:
         ...
      

      被视为一项功能。您还可以为用户定义的类指定何时应考虑通过测试(只需在 Python 2.x 中定义方法 __nonzero__ 或在 Python 3 中定义 __bool__ 方法)。

      例如对于字符串和容器,如列表、字典或集合,测试 if x ... 表示“如果 x 不为空”。

      请注意,其基本原理并不是因为这样可以减少编写代码,而是生成的代码更易于阅读和理解。

      如果您想改为写 if x is True ...,您是否考虑过沿着这条路走得更远 if (x is True) is True ...if ((x is True) is True) is True ... ? :-)

      【讨论】:

      • 您知道x is True 的值必须是TrueFalse,而您可能不知道x。这就是在极不可能的情况下停止无限递归的原因,True 具有与其他真实值不同的特殊含义:-)
      • 我明白你的意思,虽然我不确定为什么有人会编码“如果(x 为真)为真”。这就像使用“if (x == False) == False”。我同意史蒂夫的观点。
      【解决方案5】:

      不用说,您应该编写满足您需要的代码。但在大多数情况下,您根本不需要说出== Trueis True,因为您不需要将True 与其他“真实”值区分开来。因此,为简单起见,建议将其省略。

      您绝对应该使用== Trueis True 的情况是您确实需要将True 与其他真实值区分开来。

      在您的示例中,您是否关心True123 之间的区别?这会告诉你用哪种方式编码。

      关于编码== Trueis True 的一件事:当其他开发人员阅读您的代码时,它会引发一个小红旗。他们不会认为这是错误的,他们只是想知道它为什么会存在,并想知道为什么在这种特殊情况下将 True 与其他真实值区别对待很重要。

      也就是说,如果你不需要它,最好不要使用它。

      【讨论】:

        【解决方案6】:

        在 Python 2.7 中,if a:if a==True 不会为不为 1 的值提供相同的输出。以下是一些用于演示不同行为的 sn-ps 代码:

        a=1

        a=1
        if a==True: 
            print (a,"True")
        else:
            print (a,"Not True")
        
        output> (1,True)
        
        a=1
        if a: 
            print (a,"True")
        else:
            print (a,"Not True")
        
        output> (1, True)
        

        a=2

        a=2
        if a: 
            print (a,"True")
        else:
            print (a,"Not True")
        
        output> (2, True)
        
        a=2
        if a==True: 
            print (a,"True")
        else:
            print (a,"Not True")
        
        output> (2, Not True)
        

        【讨论】:

          【解决方案7】:

          我想添加一个简短的例子,说明这 3 个测试不同:

          def test(x):
              print(x, ":", bool(x), x == True, x is True)
          
          test("something")
          test(1)
          test(True)
          

          输出(格式漂亮):

          # "something" : True False False
          #           1 : True True  False
          #        True : True True  True
          

          【讨论】:

            【解决方案8】:

            如果你使用if x,这意味着它必须评估x的真值。但是当你使用x ==Truex is True时。它意味着检查type(x)==bool以及x是否为True .

            注意x is True 不等于 bool(x)==True

            当您使用 x is True 时,您正在检查 x 的 id 和 True。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2022-01-23
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多