Каждый вызов menu()
создает новую отдельную локальную область с переменными в этой области, независимыми от других вызовов menu()
.Изменения в одном вызове не влияют на локальные значения в других вызовах, даже рекурсивные.Поэтому, когда вы вызываете menu()
, новый вызов функции начинается сверху, и строка a, b = 1, 1
выполняется, и создаются новые локальные переменные a
и b
, обе из которых установлены на 1
.
Не используйте рекурсию.Используйте цикл while
и break
или return
для выхода из цикла, когда вы закончите:
def menu():
# set the initial values for a and b before starting the loop
a, b = 1, 1
while True:
ch = int(input('Choice:'))
if ch == 1:
a = 11
elif ch == 2:
b = 22
print(a+b)
else:
print('End')
# exit the function, and thus also exit the loop
return
Демонстрация:
>>> menu()
Choice:1
Choice:2
33
Choice:2
33
Choice:4
End
Рекурсия никогда не бывает хорошей идеейдля меню в любом случае;вызовы функций приводят к тому, что состояние функции current помещается на вершину стека и извлекается позднее, когда возвращается вызов функции.Этот стек имеет ограниченное количество места;слишком много выполняющихся вызовов функций, и вы получите ошибку во время выполнения.И вы будете удивлены, как часто пользователи будут выдвигать меню компьютера до этих пределов.
Конечно, вы можете передавать текущие значения a
и b
другой функции, передавая их как функциюпараметров, и вы можете вернуть новое состояние обратно вызывающей стороне с помощью return
.Но гораздо проще использовать бесконечный цикл, и таким образом вам не нужно думать о необходимости передавать состояние вашей программы каждый раз, когда вы хотите запросить у пользователя следующий ввод.
Примечание : Do не используйте is
для проверки на равенство значений, используйте ==
.is
проверяет идентичность , если оба выражения ссылаются на один и тот же объект, а не только если два объекта имеют одинаковое значение.ch is 1
и ch is 2
only случается для работы в CPython, потому что вы столкнулись с подробностями реализации интерпретатора .