2013-04-18 3 views
0

Я хочу преобразовать список значений из 0, 1 и 2 в 2,2; 1,2 и 1,1. Я написал функцию, которая, как предполагается, делает, что:UnboundLocalError: при вызове функции output

def dec2(code):      
    if code == 0: 
     ret_val = '2','2' 
    elif code == 1: 
     ret_val = '1','2' 
    elif code == 2: 
     ret_val = '1','1' 
    else: 
     ret_val = '0','0' 
    return ret_val 

Это, кажется, работает хорошо до тех пор, пока я запускаю его на готовые списки:

In [87]: a=[1,2,1,2] 

In [88]: b=[dec2(x) for x in a] 

In [89]: b 
Out[89]: [('1', '2'), ('1', '1'), ('1', '2'), ('1', '1')] 

Однако, когда я пытаюсь использовать чтобы заменить словарные значения, я получаю UnboundLocalError .:

In [82]: gtps 
Out[82]: {11: [1, 2, 1, 2], 22: [2, 2, 1, 1], 33: [1, 9, 0, 2]} 
[86]: for k,v in gtps.iteritems(): 
....:  tmp=[dec2(x) for x in v] 
....:  all[k]=tmp 
....: 
....: 
--------------------------------------------------------------------------- 
UnboundLocalError       Traceback (most recent call last) 

UnboundLocalError: local variable 'ret_val' referenced before assignment 

ЛЮБЫЕ идеи?

+0

код, который вы показали нам не возбудит 'UnboundLocalError'; убедитесь, что вы работаете с функциональной версией * right * 'dec2()'. И почему бы не просто вернуться раньше от dec2(), или еще лучше использовать сопоставление? –

+0

Я только что написал эту функцию, поэтому нет версий, о которых можно было бы говорить ... Боюсь, что я не очень хорошо знаком с картографированием! – branwen85

ответ

0

Код, который вы отправили, ни при каких обстоятельствах не может поднять UnboundLocalError, так что у вас там что-то запуталось в вашей сессии ipython.

Я хотел бы использовать вместо этого:

_code_map = {0: ('2', '2'), 1: ('1','2'), 2: ('1','1')} 
def dec2(code): 
    return _code_map.get(code, ('0', '0')) 
+0

Я запустил исходный код через скрипт, и действительно, он выглядит как мой код в порядке. Любая идея, что не так с моим ipython? – branwen85

+0

@ branwen85: Я думаю, у вас есть предыдущая версия, еще загруженная, что вы не закончили редактирование. Или, возможно, вы случайно назвали новую редакцию опечаткой. –

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