Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 13, 2010 19:53:38

Леонид
От:
Зарегистрирован: 2009-11-27
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

UnboundLocalError

привет. вот код. чего он делает не суть важно. выдаёт ошибку :

while s [p ] == ‘!’:
UnboundLocalError: local variable ‘p’ referenced before assignment

я уже с ней встречался и не случайно задал не просто целое число p, а список из одного элемнта. в чём же проблема?

s = raw_input ()

p = [0]

def reverse (x):
if x == 0:
return 1
else:
return 0

def value ():
r = 0
while s [p [0]] == '!': # ОШИБКА ТУТ
r = reverse (r)
p [0] += 1
if s [p [0]] in ['1', '0']:
if r:
res = reverse (int (s [p [0]]))
else:
res = int (s [p [0]])
else:
p [0] += 1
if r:
res = reverse (value ())
else:
res = value ()
p [0] += 1
while p [0] < len (s) and s [p [0]] in ['|', '^', '&']:
sig = s [p [0]]
p [0] += 1
r = 0
while s [p [0]] == '!':
r = reverse (r)
p [0] += 1
if s [p [0]] in ['1', '0']:
if r:
temp = reverse (int (s [p [0]]))
else:
temp = int (s [p [0]])
else:
p [0] += 1
if r:
temp = reverse (value ())
else:
temp = value ()
if sig == '&':
res *= temp
if sig == '|':
res += temp
if sig == '^':
res = ((res + temp) == res) or ((res + temp) == temp)
p [0] += 1
p += 1
return res

print value ()



Офлайн

#2 Янв. 13, 2010 20:54:59

Zubchick
От:
Зарегистрирован: 2009-07-08
Сообщения: 613
Репутация: +  0  -
Профиль   Отправить e-mail  

UnboundLocalError

интерпретатор считает p локальной переменной, которую не объявили.

Для решения проблемы, к примеру, передайте p как параметр в функцию value.
def value (p):


print value (p)



Отредактировано (Янв. 13, 2010 20:56:07)

Офлайн

#3 Янв. 14, 2010 15:28:20

Леонид
От:
Зарегистрирован: 2009-11-27
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

UnboundLocalError

Zubchick, функция рекурсивная.
дело в том что писал другую прогу, с тем же обходом ошибки (т.е. задать p как список) и всё работало



Офлайн

#4 Янв. 14, 2010 15:55:09

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

UnboundLocalError

Сделайте вначале тела функции value

global p
Но алгоритм все равно не работает



Офлайн

#5 Янв. 14, 2010 16:34:06

Zubchick
От:
Зарегистрирован: 2009-07-08
Сообщения: 613
Репутация: +  0  -
Профиль   Отправить e-mail  

UnboundLocalError

а в чем проблема то, что она рекурсивная, передавай p параметром, он что так изменяться будет, что так, тока мой способ еще и отвечает хорошему стилю программирования +)

вот смотри пример моего кода, ситуация аналогичная:

def flat(lst, flat_lst = []):
"""делает список одномерным"""
for lexem in lst:
if not is_atom_(lexem): # проверка на то что lexem это список
flat(lexem, flat_lst)
else:
flat_lst.append(lexem)
return flat_lst
Но алгоритм все равно не работает
и это тоже, но просили на алгоритм не смотреть)

И все же я считаю эту глобализацию внутри функций мировым злом!



Отредактировано (Янв. 14, 2010 16:36:36)

Офлайн

#6 Янв. 14, 2010 16:56:41

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

UnboundLocalError

Передача mutable в качестве параметра по умолчанию тоже зло еще то. А изменение его внутри функции еще добавляет зла.



Офлайн

#7 Янв. 14, 2010 17:13:23

Zubchick
От:
Зарегистрирован: 2009-07-08
Сообщения: 613
Репутация: +  0  -
Профиль   Отправить e-mail  

UnboundLocalError

Передача mutable в качестве параметра по умолчанию тоже зло еще то. А изменение его внутри функции еще добавляет зла.
а в чем беда?



Отредактировано (Янв. 14, 2010 17:13:50)

Офлайн

#8 Янв. 14, 2010 17:35:48

Леонид
От:
Зарегистрирован: 2009-11-27
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

UnboundLocalError

всё!!!!!!!!!!! спасибо всем! написал global p и мне явилась ошибка:

line 54, in value
p += 1
TypeError: ‘int’ object is not iterable

т.е. global p не требуется и достаточно заменить строку на p += 1 ))
очепятался я.



Офлайн

#9 Янв. 14, 2010 17:38:51

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

UnboundLocalError

Zubchick
а в чем беда?
Беда в том, что такая практика порождает гораздо более непонятные ошибки, чем даже применение global. Так что вы учите людей плохому.
Попробуйте вызвать свою функцию flat с одним параметром 2 раза и посмотреть на результат. Уверяю, вы будете удивлены.



Отредактировано (Янв. 14, 2010 17:40:17)

Офлайн

#10 Янв. 14, 2010 17:46:56

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

UnboundLocalError

Ed
Беда в том, что такая практика порождает гораздо более непонятные ошибки, чем даже применение global.
+



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version