【问题标题】:Python - Does .pop() always execute, even within conditional statements?Python - 即使在条件语句中,.pop() 是否总是执行?
【发布时间】:2020-10-09 20:22:54
【问题描述】:

如果我在条件语句中使用 .pop(),即使条件不满足,pop 是否仍然执行?

例如

if something != stack.pop():
    return False
else:
    return True

说不满足条件,不返回False,那么[stack]的最后一个元素是否还在pop?

编辑:

感谢大家澄清这一点。我曾假设在 IF 条件子句中它会检查 pop 是否满足条件,但实际上不会对列表进行更改。

【问题讨论】:

  • return something == stack.pop() 会在一行中做同样的事情。
  • @AdrianW 这无关紧要,因为代码本身只是一个示例

标签: python python-3.x list stack


【解决方案1】:

是的,项目在条件评估期间被弹出。不管结果如何,该项目已被弹出。您可以通过在每种情况下打印堆栈来测试这一点。

def myfunc(stack):
    if 4 != stack.pop(): # Swap 4 to test
        print(stack) # [1, 2, 3]
        return False
    else:
        print(stack) # [1, 2, 3]
        return True


if __name__ == '__main__':
    print( myfunc([1, 2, 3, 4]) )

【讨论】:

    【解决方案2】:

    是的,它会弹出,因为你调用了它。无论您在哪里调用它,无论是条件还是将其作为参数传递,它都会“弹出”它的工作。

    如果您想安全地检查值并同时弹出,那么添加额外的行不会有任何害处。

    if something != stack[-1]:
        stack.pop()
        return False
    else:
        return True
    

    注意:我做这个例子时考虑到stack 是一个列表,因为pop() 将删除列表中的最后一项,所以我做了stack[-1]

    【讨论】:

      【解决方案3】:

      是的,无论是否满足条件,都会执行 pop() 方法。因为任何像if(something!=stack.pop()) 这样的条件语句都是从右到左执行的。所以会先执行pop语句,然后再进行比较。

      下面是我用来验证的例子。

      stack=[1,5,7,8,9]
      something=9
      if(something!=l1.pop()):
          print(False)
      else:
          print(True)
          print(l1)
      

      【讨论】:

        【解决方案4】:

        在您的条件中,您正在与弹出的结果进行比较。因此需要执行 pop,以便实际比较某些内容。

        这样想

        temp = stack.pop()
        if 4 != temp:
        

        如果您想检查堆栈中是否有特定项目,并且只有 pop() 是这种情况,您可以使用:

        # Check if there is anything in the stack, to avoid accessing an invalid position
        if (stack.count() > 0 ):
            value = stack[-1]
            if (value == 4:
                stack.pop()
                print( stack )
                return False
            else:
                print( stack )
                return True
        

        如果您更频繁地需要它(或者为了使代码更具可读性),您可以将其放入一个小函数中:

        def peek( list ):
            if ( list.count() > 0 ):
                return list[-1]
            else:
                return None
        
        if ( peek( stack ) == 4 ):
             stack.pop()
        
        

        【讨论】:

          猜你喜欢
          • 2013-10-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-17
          • 2016-01-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多