Не могу понять, как Python интерпретирует этот оператор 'или' - PullRequest
0 голосов
/ 26 апреля 2019

То, как Python интерпретирует следующий синтаксис, не имеет смысла для меня (и я потерял два часа на отладку кода из-за этого!):

Допустим, у вас есть следующий код:

def returns_true():
    print('i\'ve been called!')
    return True

for val in [True, False]:
    print('val =', val)
    print(val or returns_true())

получая следующий вывод

val = True
True
val = False
i've been called!
True

Может кто-нибудь объяснить, почему returns_true() вызывается только тогда, когда val равен False?Разве Python не должен вызывать функцию, чтобы оценить ее возвращаемое значение с помощью оператора or?

1 Ответ

1 голос
/ 26 апреля 2019

Это связано с оценкой "короткого замыкания".Поскольку True or anything должен возвращать True, интерпретатор немедленно возвращает True перед оценкой остальных, что не может изменить результат.

* and и or являются операторами короткого замыкания в Python какможно увидеть в документах .Оператор or немедленно вернется, если левая сторона (LHS) верна, поскольку правая сторона (RHS) не может повлиять на результат (True or False == True or True == True).Оператор and немедленно вернется, если LHS равен False, поскольку результат должен быть False

Более подробную информацию об оценке короткого замыкания см. В Wikipedia Оценка короткого замыкания

...