Форум сайта python.su
привет. вот код. чего он делает не суть важно. выдаёт ошибку :
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 ()
Офлайн
интерпретатор считает p локальной переменной, которую не объявили.
Для решения проблемы, к примеру, передайте p как параметр в функцию value.
def value (p):
…
print value (p)
Отредактировано (Янв. 13, 2010 20:56:07)
Офлайн
Zubchick, функция рекурсивная.
дело в том что писал другую прогу, с тем же обходом ошибки (т.е. задать p как список) и всё работало
Офлайн
Сделайте вначале тела функции value
global p
Офлайн
а в чем проблема то, что она рекурсивная, передавай 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)
Офлайн
Передача mutable в качестве параметра по умолчанию тоже зло еще то. А изменение его внутри функции еще добавляет зла.
Офлайн
Передача mutable в качестве параметра по умолчанию тоже зло еще то. А изменение его внутри функции еще добавляет зла.а в чем беда?
Отредактировано (Янв. 14, 2010 17:13:50)
Офлайн
всё!!!!!!!!!!! спасибо всем! написал global p и мне явилась ошибка:
line 54, in value
p += 1
TypeError: ‘int’ object is not iterable
т.е. global p не требуется и достаточно заменить строку на p += 1 ))
очепятался я.
Офлайн
ZubchickБеда в том, что такая практика порождает гораздо более непонятные ошибки, чем даже применение global. Так что вы учите людей плохому.
а в чем беда?
Отредактировано (Янв. 14, 2010 17:40:17)
Офлайн
Ed+
Беда в том, что такая практика порождает гораздо более непонятные ошибки, чем даже применение global.
Офлайн