что не так с присваиванием значения переменной?

Рейтинг: -1Ответов: 2Опубликовано: 05.08.2023

a и b нормально вводятся, а как дело доходит до c, то выдает ошибку "name 'c' is not defined", подскажите ошибочку

print(3 if (a := int(input())) == (b := int(input())) == (c := int(input())) else 1 if a != b and a != c else 2)

Ответы

▲ 1

Я все понял и переписал

a, b, c = [int(input()) for i in range(3)]
print(3 if a == b and a == c else 0 if a != b and b != c and a != c else 2)
▲ 1
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)))])