print(3 if (a := int(input())) == (b := int(input())) == (c := int(input())) else 1 if a != b and a != c else 2)
Если первые два числа различны, то выражение (c := int(input()))
не вычисляется, число для c
не вводится, переменная c
не определяется. При вычислении a != c
в дальнейшем происходит обращение к неопределённой переменной.
Выражение A == B == C
в Питоне вычисляется примерно как (A == B) and (B == C)
. Примерно, потому что B
вычисляется один раз. В других языках такого нет.
Глядя на вторую запись можно понять что если A
не равно B
, то вторая скобка не будет вычислена и соответствующих побочных эффектов не будет. А их тут два: ввод числа из входного потока и определение переменной c
.
Общая причина почему возникла ошибка - смешение вычислений и побочных эффектов. Всегда нужно быть осторожным. Условный пропуск ввода - катастрофа для пользователя.
Минимальная правка:
a = int(input())
b = int(input())
c = int(input())
print(3 if a == b == c else 1 if a != b and a != c else 2)
Ориентируясь на другой ответ, можно предложить однострочник:
print((None, 3, 2, 0)[len(set(int(input()) for _ in range(3)))])