Вопрос о коротком замыкании с python логическими операторами - PullRequest
0 голосов
/ 03 мая 2020

Согласно правилам короткого замыкания, каждый раз, когда у нас есть оператор True or ..., он возвращает True независимо от остальной части оператора. например, даже если остальная часть инструкции выдает ошибку, она вернет True. Аналогично, оператор False and ... всегда возвращает False. Я также нашел это объяснение онлайн, чтобы подвести итог.

Итак, когда я попытался запустить это:

a = False or (5>"hello")
print(a)  

У меня было TypeError, потому что ' > 'не поддерживается между str и int.

b = True or (5>"hello")
print(b)

Однако, этот вывод печатает True и подтверждает правило короткого замыкания. Я сделал то же самое, подав заявку на False and ... здесь:

c = False and (5>"hello")
print(c)

, и этот печатает False, как и ожидалось.

Пока что мы продемонстрировали концепцию короткого замыкания. Но вот проблема:

d = False and False or True
print(d)

e = True or False and False
print(e)

Если вы запустите приведенный выше код, вы увидите, что d и e равны True. Хотя у нас есть False and ... оператор в начале для d, кажется, что он выполняется весь оператор без короткого замыкания. Итак: Ложь и Ложь -> Ложь, Ложь или Правда -> Правда. Здесь я подумал: «Хм, хорошо. Может быть, это потому, что у меня было 3 логических значения». Но когда дело дошло до e, программа, кажется, имеет короткое замыкание, потому что если это не так, результатом должно быть: True или False -> True, True и False -> False.

Не могли бы вы объяснить, почему программа замыкается накоротко на e, а не на d?

1 Ответ

1 голос
/ 03 мая 2020

and имеет более высокий приоритет, чем or, поэтому ваш код эквивалентен этому:

d = (False and False) or True
print(d)

e = True or (False and False)
print(e)

Чтобы он работал так, как вы ожидаете, вы должны изменить d на это:

d = False and (False or True)
...