提问者:小点点

如果我们改变操作数在逻辑语句中的位置,会有什么不同吗?


我用python编写了以下函数,它返回一个子列表(即它一直在迭代直到找到一个特定值(在我的例子中是5)而没有将其包含在子列表中,并且也停止进一步迭代的列表部分)。

def sublist(a):
    b=[]
    i=0
    while(a[i]!=5 and i<=len(a)-1):
        b.append(a[i])
        i=i+1
    return b

除了这个a=[1,6,2,3,9]之外,上面的函数在所有测试用例中都能很好地工作。 它给出了以下错误:indexerror:list index out of range

但是,当我交换while循环条件的操作数并以以下方式编写相同的代码时,我得到了所有测试用例的输出:

def sublist(a):
    b=[]
    i=0
    while(i<=len(a)-1 and a[i]!=5):
        b.append(a[i])
        i=i+1
    return b

为什么我在第一种情况下没有得到输出?


共1个答案

匿名用户

这被称为“逻辑短路”,当一个逻辑表达式需要计算时,编程语言观察第一个操作数,然后说:“这是一个OR,如果第一个操作数对我来说没问题,整个表达式就没问题!” 所以它忽略了第二个。

对于AND,这是一样的,但是:“这是一个AND,如果第一个操作数可以,我必须检查第二个操作数,否则整个表达式都不可以。”

在这种情况下,您首先检查一个[i],该[i]

可能

抛出一个异常,然后为i<=len(a)-1。

我做了一点eli5。

编辑:我忘了,如果你不使用括号,也请看这个表https://en.wikipedia.org/wiki/logical_connective#order_of_precerence

同时,作为一名计算机专家,你必须对短电路有很好的了解,它可以帮助你提高性能