Фон
Как мы все знаем, лучше не предполагать, что несколько переменных используют chain assignment
, как a = b = [1,2,3]
, потому что a
будет уменьшенной копией b
. Это небезопасно, потому что a
изменится, когда мы пересмотрим b
.
Однако, если инициализация неизменна , мы можем сделать это a = b = 1
, и это безопасно.
Недавно я обнаружил странное использование нескольких операторов в выражении условия потока управления , например if 1 < b < 2:
или while a == b == c == 1:
Например, следующее управляющий поток выполняет разные фрагменты в разных условиях:
a = 1
b = 1
c = 2
if a == b == c == 1:
print('All equal!')
else:
print('At least one variable is not equal to others')
Хотя бы одна переменная не равна другим
Мой вопрос
Безопасно ли это использование нескольких операций в логическом выражении в потоке управления ? Я знаю, что мы должны проверить приоритет оператора , когда мы пишем логическое выражение . Есть ли что-то еще, за чем мы должны следить? Я пытаюсь некоторое время и думаю, что использование нескольких операторов безопасно.
Анализ байт-кода
Я набираю байт-код следующей программы:
a = 1;b =2;c =1.5
a<b<c
import dis
dis.dis('a<b<c')
1 0 LOAD_NAME 0 (a)
2 LOAD_NAME 1 (b)
4 DUP_TOP
6 ROT_THREE
8 COMPARE_OP 0 (<)
10 JUMP_IF_FALSE_OR_POP 18
12 LOAD_NAME 2 (c)
14 COMPARE_OP 0 (<)
16 RETURN_VALUE
> 18 ROT_TWO
20 POP_TOP
22 RETURN_VALUE```
Я могу только признать, что он сравнивает a
и b
на шаге 10, а затем сравните a
и c
на шаге 14. Но почему он по-прежнему возвращает False
. Я не знаком с анализом байт-кода . Если кто-то может помочь с анализом, я буду очень признателен! Вот официальное руководство по модулю : dis