繁体   English   中英

在以下情况下,为什么Python不抛出索引错误?

[英]Why doesn't Python throw an Index Error for the following case?

我在涉及布尔运算的“ if”条件语句中遇到了这种Python场景。 每当条件中出现索引错误时,Python会将其视为False而不是抛出Index Error 此行为的原因是什么。

示例场景:

lst = [3, 4, 23, 5, 25, 76]
n = len(lst)
if n < 5 and lst[6] > lst[2]:
    print True
print False

输出:

False

如您所见,为什么Python返回False ?,我期望它会引发Index Error 有人可以解释幕后发生的事情吗?

在您的示例中,n = 6,因此n不小于5。Python会短路布尔逻辑,因此将跳过and表达式的后半部分。

and在Python中利用了短路评估 ,这意味着,如果其第一个参数的计算结果为false(如n < 5一样),则第二个参数将保持未计算状态,因为此时整个表达式的结果必须为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

这给出了您期望的结果。

当结果已知时,Python会尽快停止评估条件。 在您的示例中, n < 5False因此在有连词( and )的情况下,无需评估第二部分-与其评估的结果无关紧要,目前已知整个表达式为False

如果第一个条件为True ,则or表达式也是如此。

if not (n >= 5 or lst[6] <= lst[2]):

也不会丢。

这种机制称为短路评估

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

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

在这种情况下,很明显为什么如果n不小于5,第二个if不会引发错误:它从不执行。 由于其他人已经描述了短路功能,将它们组合到一个if具有完全相同的行为。

写作的“长”的方式or ,顺便说一下,是这样的:

# if x == 0 or 1/x > 0.01: print True
if x == 0:
    print True
elif 1/x > 0.01:
    print True

在此,如果x不为零,则仅通过计算1/x来避免被零除(错误)。 带有or的单if版本也是如此。 由于在这种情况下x == 0是true,因此通过评估该项可以知道表达式的真值,因此无需评估第二项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM