为什么Python不为下面的情况抛出索引错误?

为什么Python不为下面的情况抛出索引错误?,python,algorithm,python-2.7,if-statement,boolean,Python,Algorithm,Python 2.7,If Statement,Boolean,我在涉及布尔运算的if条件语句中遇到了这个Python场景。只要条件中存在索引错误,Python就会将其视为False,而不是抛出索引错误。这种行为的原因是什么 示例场景: 正如您所看到的,Python为什么返回False?我希望它抛出一个索引错误。有人能解释一下幕后发生了什么吗。在你的例子中,n=6,所以n不是

我在涉及布尔运算的if条件语句中遇到了这个Python场景。只要条件中存在索引错误,Python就会将其视为False,而不是抛出索引错误。这种行为的原因是什么

示例场景:


正如您所看到的,Python为什么返回False?我希望它抛出一个索引错误。有人能解释一下幕后发生了什么吗。

在你的例子中,n=6,所以n不是<5。Python短路布尔逻辑,因此跳过and表达式的后半部分。

当结果已知时,Python会尽快停止计算条件。在你的例子中,n<5是假的,所以在一个连词的情况下,不需要计算第二部分-它与它的计算结果无关,因为此时整个表达式是假的

如果第一个条件为真,则or表达式也是如此,因此:

也不会扔

该机制被称为。

,在Python中使用,这意味着如果其第一个参数的计算结果与n<5一样为false,则第二个参数将保持未计算状态,因为此时整个表达式的结果必须为false。因此,永远不会对lst[6]>lst[2]进行评估

现在,让我们尝试使用不短路的&:

>>> lst = [3, 4, 23, 5, 25, 76]
>>> n = len(lst)
>>> if (n < 5) & (lst[6] > lst[2]):
...     pass
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range
这将给出您期望的结果。

在if语句中使用and就像编写两个if语句,一个在另一个内部:

if n < 5:
    if lst[6] > lst[2]:
        print True

在这里,如果x不为零,我们只计算1/x,从而避免了被零除的错误。这同样适用于带有或的单if版本。因为在这种情况下x==0是真的,表达式的真值是通过计算该项而知道的,所以不需要计算第二项。

因为if的后半部分如果为假则不需要计算。。。它可以短路,例如将其更改为n<20。。。或者将or@JonClementsWell&的行为类似于布尔上下文,只是它不会短路,这是这里的重要区别。当然,或也会起作用。虽然这个答案对原始问题的作者有用,但应该注意,这种分解为嵌套if语句的方法对于涉及“and”和“or”的嵌套和/或串联表达式的伸缩性不好。在某些阶段,最好学会使用短路操作员的解释,如果可能会对整体表达结果产生影响,则只能对其RHS上的内容进行评估,因此可能会忽略副作用,如原始的索引错误。是的,我并不是真的建议他们应该这样写,虽然有时候,当一个人的条件变得太苛刻时,这是有道理的;这只是对理解的一种帮助。嗨@kindall,很抱歉搞混了。我的评论不是针对你,而是针对阿伦帕萨斯·尚卡尔和未来的读者,旨在提醒他们在发展的某个阶段坚持理解短路解释-
if not (n >= 5 or lst[6] <= lst[2]):
>>> lst = [3, 4, 23, 5, 25, 76]
>>> n = len(lst)
>>> if (n < 5) & (lst[6] > lst[2]):
...     pass
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range
if n < 5:
    if lst[6] > lst[2]:
        print True
# if x == 0 or 1/x > 0.01: print True
if x == 0:
    print True
elif 1/x > 0.01:
    print True