2011-12-20 3 views
1

Я только начал программировать и пытался что-то написать, но (конечно) это не получилось. После того, как я дошел до настоящей проблемы: UnboundLocalError. Таким образом, чтобы спасти вас от всех обломков вокруг меня раздели код к этому:Как обойти UnboundLocalError?

def test(): 
    try: 
     i1 = int(i1) 
     i2 = int(i2) 
    except ValueError: 
     print "you failed in typing a number" 

def input(): 
    i1 = raw_input('please type a number \n >') 
    i2 = raw_input('please type a number \n >') 

Тогда я записал:

>>>input() 
please insert a number 
> 3 
please insert a number 
> 2 
>>>test() 

А потом я получил:

that was not a number 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 7, in test 
UnboundLocalError: local variable 'i1' referenced before assignment 

Как может Я решаю это по-питоновски? Или я должен пойти совершенно по-другому?

+1

Подумайте об этом так: обычные переменные, такие как 'i1' и' i2', являются локальными для функции и не видны вне нее. Ваша функция 'input' создает локальные переменные, которые неизвестны' test'. Если вы хотите получить доступ к данным в 'test', эти данные должны быть глобальными (см.« Глобальное »ключевое слово для глобальных переменных) или явно передаваться ему с использованием аргументов функции (см. Ответ Cédrick Julien). Как правило, следует избегать глобальных переменных, если это возможно. –

ответ

6

Самый стандартный способ сделать это, чтобы дать параметры вашего метода испытаний:

def test(i1, i2): 
    try: 
     i1 = int(i1) 
     i2 = int(i2) 
    except ValueError: 
     print "you failed in typing a number" 

def input(): 
    i1 = raw_input('please type a number \n >') 
    i2 = raw_input('please type a number \n >') 
    test(i1, i2) # here we call directly test() with entered "numbers" 

Если вы действительно хотите проверить на интерактивном режиме, вы можете сделать (как это было предложено в @FerdinandBeyer комментарии):

def test(i1, i2): 
    try: 
        i1 = int(i1) 
        i2 = int(i2) 
    except ValueError: 
        print "you failed in typing a number" 
    return i1, i2 
     
def input():  
    i1 = raw_input('please type a number \n >') 
    i2 = raw_input('please type a number \n >') 
    return i1, i2 

А потом, на заставке:

>>>var1, var2 = input() 
please insert a number 
> 3 
please insert a number 
> 2 
>>>test(var1, var2) 
+0

+1. 'input' должен возвращать переменные, чтобы OP мог проверить свои функции в интерактивном приглашении:' i1, i2 = input(); test (i1, i2) '. –

0

использовать ключевое слово "глобальный".

def test(): 
    global i1 
    global i2 
    try: 
     i1 = int(i1) 
     i2 = int(i2) 
    except ValueError: 
     print "you failed in typing a number" 

def input(): 
    global i1 
    global i2 
    i1 = raw_input('please type a number \n >') 
    i2 = raw_input('please type a number \n >') 

Это приводит к i1 и i2 следует рассматривать как глобальные переменные (доступный по всей программе), а не локальный переменные (доступно только в функции они определены в - это вызвало исключение)

Смежные вопросы