为什么 'or' 条件中的语句顺序很重要?

Why does the order of statements in an 'or' condition matter?

我正在解决一个问题,我在原地颠倒单词。我注意到,根据 or 运算符之前和之后的语句顺序,代码将无法正常工作。

如果我改变

if i == len(s1) or s1[i] == ' ':

if s1[i] == ' ' or i == len(s1):

我收到错误

Traceback (most recent call last):
  File "reverse_words_in_place.py", line 58, in <module>
    reverse_words(s1)
  File "reverse_words_in_place.py", line 6, in reverse_words
    if s1[i] == ' ' or i == len(s1):
IndexError: list index out of range
def reverse_words(s1):
    reverse_string(s1, 0, len(s1)-1)

    start_index = 0
    for i in range(len(s1)+1):
        if i == len(s1) or s1[i] == ' ':
            reverse_string(s1, start_index, i-1)
            start_index = i + 1
    return s1


def reverse_string(s1, first, last):
    while(first < last):
        s1[first], s1[last] = s1[last], s1[first]

        first += 1
        last -= 1

s1 = ['c', 'a', 'k', 'e', ' ',
      'p', 'o', 'u', 'n', 'd', ' ',
      's', 't', 'e', 'a', 'l']

reverse_words(s1)

# Prints: 'steal pound cake'
print(''.join(s1))

此代码的输出是

steal pound cake

只要

if i == len(s1) or s1[i] == ' ':

为什么这些语句的顺序很重要?

因为如果 i == len(s1)true 第二个语句不会被评估并且你不会得到 IndexError.

原因是Short-circuit_evaluation

这是因为在python中,和大多数编程语言一样,运算符orand短路。例如,如果 or 的左侧为真,则它知道 entire or 语句无需费心检查右侧即可。

冗长的解释:

似乎 想评估 A 或 B 我们将从评估 A 开始,然后我们将评估 B,最后将结果 放在一起作为最终结果。但是,实际上 发生的是 "short circuit":A 被评估,如果它是真的,我们不会费心评估 B 完全 因为我们知道当时 A 或 B 计算结果为真。

类似地,A 和 B 短路:我们从评估 A 开始,如果它是假的,我们已经知道 A 和 B 的计算结果为假,所以我们根本不用计算 B

这可以实际上用于编写更简洁的代码。例如,以下内容:

if A: # is obj valid?
  if B: # do a check that requires obj to be valid
    C

...可以这样写:

if A and B:
  C

OR 一旦找到 true 就停止寻找条件。