【问题标题】:switching sides of `and` statement in while loop boolean在while循环布尔中切换“and”语句的两侧
【发布时间】:2020-10-25 02:15:05
【问题描述】:

我的问题是我想写一个函数newlist,它接受一个数字的list作为参数。然后它根据参数返回一个新列表。新列表包含与原始列表相同的值,直到达到数字 7。

我的代码有效:

def newlist(mylst):
    newlst = []
    idx = 0
    while (idx < len(mylst)) and (mylst[idx] != 7):
        newlst.append(mylst[idx])
        idx += 1
    return newlst

现在当我像这样切换and 语句的两侧时:

while (mylst[idx] != 7) and (idx &lt; len(mylst)):

它告诉我这是错误的,当传递一个列表作为参数时,索引是 超出范围。我的问题是为什么它与我开始的and 语句的哪一侧有区别?我认为布尔值只有在两个语句都为 True 时才为 True,而不管顺序如何?

【问题讨论】:

  • 如果您的列表有 10 个数字,并且 5 个不是其中之一,则 while 循环将继续直到您的 idx ==11,并且您的条件之一 mylst[idx] 将尝试找到第 11 个10 值列表的值。
  • 请参考answer

标签: python while-loop boolean logical-operators


【解决方案1】:

不同之处在于and 运算符使用短路。这意味着如果第一个操作数为假,则不计算第二个操作数。

如下:

(idx < len(mylst)) and (mylst[idx] != 5)

第一个操作数是(idx &lt; len(mylst))。这将检查 idx 是否在范围内。如果是,则计算第二个操作数,它使用idx 作为mylst 的索引。但如果不是,则计算停止并且表达式的结果为False。这样,它就永远不会索引越界,因为第一个操作数保护了第二个操作数的评估。

第二个版本是:

(mylst[idx] != 5) and (idx < len(mylst))

在这里,操作数被反转。因此,如果idx 超出范围,它仍会尝试将其用作mylst 的索引,从而导致错误。

所以这两个版本有非常显着的区别。第一个版本在尝试将 idx 用作索引之前安全地检查它是否在范围内,而第二个版本则没有。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 2018-05-16
    • 1970-01-01
    相关资源
    最近更新 更多