if v in word_dict == True
элюируется как if v in word_dict and word_dict==True
. Это называется операторным связыванием.
Проверьте этот байт-код, используя модуль dis.
import dis
a={'a':1,'b':2,'c':3}
In [53]: dis.dis('"a" in a == True')
1 0 LOAD_CONST 0 ('a')
2 LOAD_NAME 0 (a)
4 DUP_TOP
6 ROT_THREE
8 COMPARE_OP 6 (in)
10 JUMP_IF_FALSE_OR_POP 18
12 LOAD_CONST 1 (True)
14 COMPARE_OP 2 (==)
16 RETURN_VALUE
>> 18 ROT_TWO
20 POP_TOP
22 RETURN_VALUE
In [54]: dis.dis('"a" in a and a==True')
1 0 LOAD_CONST 0 ('a')
2 LOAD_NAME 0 (a)
4 COMPARE_OP 6 (in)
6 JUMP_IF_FALSE_OR_POP 14
8 LOAD_NAME 0 (a)
10 LOAD_CONST 1 (True)
12 COMPARE_OP 2 (==)
>> 14 RETURN_VALUE
Оба вычисляются одинаково. И в вашем случае word_dict==True
всегда False
, поскольку word_dict
это словарь . Таким образом, он никогда не войдет в блок if
, и блок else
будет выполнен.
if some_bool_expr == True
и может быть записан как if some_bool_expr
, а if some_bool_expr==False
может быть записан как if not some_bool_expr
.
Байт-код Ссылка документации документации
LOAD_CONST
и LOAD_NAME
: pu sh значение в стеке. После строки 2 вершина стека равна a
(не 'a'
)
DUP_TOP
: дублирует ссылку на вершине стека и помещает ее в стек. Теперь вершина стека равна a
.
ROT_THREE
: поднимает второй и третий элементы стека на одну позицию вверх, перемещает сверху вниз на позицию три. Теперь TOS
(вершина стека) является третьим элементом (a
), а 2-й элемент (a
) теперь TOS
, 3-й элемент 'a'
теперь является 2-м элементом.
COMPARE_OP
: Говорит интерпретатору вытолкнуть два верхних элемента стека и выполнить тест на членство (in
) между ними, перенеся логический результат обратно в стек. 'a' in a
сделано, и результат помещается в стек, т.е. True
. Теперь у стека есть TOS как True
и дублирующая ссылка от DUP_TOP
под ним.
JUMP_IF_FALSE_OR_POP
: Если TOS имеет значение false, устанавливает счетчик байт-кода на цель и оставляет TOS в стеке. В противном случае (TOS верно), TOS выскочил. В нашем примере TOS
равно True
. TOS
выскочил. Теперь TOS
равно a
.
LOAD_CONST
True
помещено в стек. COMPARE_OP
==
. True==a
сделано, что False
. Теперь TOS
равно False
.
RETURN_VALUE
: Возвращает с TOS вызывающей функции. В нашем примере TOS
- это False
на данный момент. False
возвращается.
POP_TOP
: удаляет элемент top-of-stack (TOS).
Единственное различие между обоими выражениями состоит в том, что a
вычисляется дважды в 2-й.
Также см. этот ответ: { ссылка }