Странное поведение 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 никогда не устанавливается.

Другие вопросы по тегам