【问题标题】:"if var and var2 == getSomeValue()" in python - if the first is false, is the second statement evaluated?'python中的“if var and var2 == getSomeValue()” - 如果第一个为假,则评估第二个语句吗?
【发布时间】:2011-09-08 00:16:23
【问题描述】:

我有一些这样的代码:

if var:
    if var2 == getSomeValue()

这可以在一个表达式中。

if var and var2 == getSomeValue():

...但是 getSomeValue() 只有在 var 为 True 时才能被调用。

所以,当调用if var and var2 == getSomeValue() 时,两者都由解释器评估,或者如果False,评估在var 处停止?在哪里可以找到有关 python 文档的这些信息? (我不知道要搜索什么...:/)

【问题讨论】:

    标签: python short-circuiting


    【解决方案1】:

    关于“我不知道要搜索什么

    当有可用索引时,您无需搜索:

    浏览到Python home page。依次点击

    • 文档
    • 当前文档
    • 索引(在右上角)
    • 一个

    向下滚动直到看到

    and
        bitwise
        operator
    

    你不想bitwise,点击operator

    如果您使用的是 Windows,则您的计算机上有手册,并且具有足够好的 GUI 界面。查看左上角附近的目录/索引/搜索/收藏夹窗格。

    【讨论】:

      【解决方案2】:

      Python documentation 表示 andor 是短路的,所以不,如果 var 为假,则不会评估 var2 == getSomeValue()

      【讨论】:

        【解决方案3】:

        这称为短路,Python 会这样做,所以你很好。

        更新:这是一个简单的例子。

        >>> def foo():
        ...     print "Yay!"
        ... 
        >>> if True and foo() is None:
        ...     print "indeed"
        ... 
        Yay!
        indeed
        >>> if False and foo() is None:
        ...     print "nope"
        ... 
        

        更新 2:将relevant PEP (308) 放在我的答案中,这样它就不会在@Somebody 的出色评论中被忽视,仍然使用您的 MS-DOS。

        【讨论】:

        【解决方案4】:

        如果 varFalse,则停止计算。

        请参阅PEP 308 中的短路行为部分。

        【讨论】:

          【解决方案5】:

          第二个项目没有被评估——你可以用一个简单的程序来验证:

          def boo():
            print "hi"
            return True
          
          a = False
          b = True
          
          if a and b == boo():
            print "hi2"
          

          运行它不会产生任何输出,因此您可以看到从未调用过 boo()

          【讨论】:

            【解决方案6】:

            评估 getSomeValue 不会被评估:

            var = False
            if var and foo():
               print "here"
            else:
               print "there"
            
            def foo():
               print "In foo"
               return False
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2013-05-12
              • 2017-03-02
              • 2012-07-06
              • 2018-07-18
              • 2015-08-22
              • 1970-01-01
              • 1970-01-01
              • 2021-08-25
              相关资源
              最近更新 更多