Странное поведение Python 3.8 Walrus Operator: цепные неравенства
Следующий код:
a,b=1,2
print((x:=a)<2<(z:=b) or z>1>x)
print((x:=a)<1<(y:=b) or y>1>x)
дает следующий результат:
False
Traceback (most recent call last):
File "C:/Users/phili/PycharmProjects/ML 1/CodingBat exercises.py", line 56, in <module>
print((x:=a)<1<(y:=b) or y>1>x)
NameError: name 'y' is not defined
что кажется абсолютно непоследовательным. Некоторые вариации вроде(x:=1)>=2>(y:=9) or y>=2>x
также дает
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'y' is not defined
Кто-нибудь знает, что происходит?
1 ответ
Решение
Видимо короткое замыкание прикованных операторов. Вы можете увидеть это в этом примере кода:
>>> 1 < 1 < print("Nope")
False # Nothing else is printed
Вероятно, потому что
a < b < c
По сути, это сокращение от
a < b and b < c
И
and
короткие замыкания:
>>> False and print("Nope")
False
Это означает, что, поскольку левая проверка ложна, правая часть никогда не оценивается, поэтому
y
никогда не устанавливается.