2014-10-29 3 views
1

Я создал программу на Python 3.4.1, которая; запрашивает целое число, проверяет, что это целое число, выдает сообщение об ошибке и запрашивает номер для повторного ввода, если не целое число, после проверки числа добавляет его в список, заканчивается, если введено значение -1.Ошибка Python Traceback во время цикла после обработки ошибок

mylist = [] 

def checkint(number): 
    try: 
     number = int(number) 
    except: 
     print ("Input not accepted, please only enter whole numbers.") 
     number = input("Enter a whole number. Input -1 to end: ") 
     checkint(number) 


number = input("Enter a whole number. Input -1 to end: ") 
checkint(number) 

while int(number) != -1: 

    mylist.append(number) 
    number = input("Enter a whole number. Input -1 to end: ") 
    checkint(number) 

Это все работает нормально, за исключением одного сценария. Если вводится не целое число, например. р (который выдает сообщение об ошибке), а затем на -1, чтобы закончить программу, я получаю сообщение:

Traceback (most recent call last): 
    File "C:/Users/************/Documents/python/ws3q4.py", line 15, in <module> 
    while int(number) != -1: 
ValueError: invalid literal for int() with base 10: 'p' 

Я не понимаю, почему это происходит, так как ввод р никогда не должен получить как

while int(number) != -1: 
+2

Это обзор. У вас есть переменная 'number', которая является глобальной, а переменная' number' является локальной для 'checkint' - это вызывает путаницу. После проверки вам нужно передать переменную из функции, чтобы она работала. –

ответ

2

Вот минимальный пример, иллюстрирующий проблему:

>>> def change(x): 
     x = 2 
     print x 

>>> x = 1 
>>> change(x) 
2 # x inside change 
>>> x 
1 # is not the same as x outside 

Вам нужно исправить функцию return что-то, и назначить что number в т его внешний охват:

def checkint(number): 
    try: 
     return int(number) # return in base case 
    except: 
     print ("Input not accepted, please only enter whole numbers.") 
     number = input("Enter a whole number. Input -1 to end: ") 
     return checkint(number) # and recursive case 

number = input("Enter a whole number. Input -1 to end: ") 
number = checkint(number) # assign result back to number 

Кроме того, лучше сделать это итеративно, а не рекурсивно - см., например, Asking the user for input until they give a valid response.