Найти - Пользователи
Полная версия: UnboundLocalError
Начало » Python для новичков » UnboundLocalError
1 2
Леонид
привет. вот код. чего он делает не суть важно. выдаёт ошибку :

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 ()
Zubchick
интерпретатор считает p локальной переменной, которую не объявили.

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


print value (p)
Леонид
Zubchick, функция рекурсивная.
дело в том что писал другую прогу, с тем же обходом ошибки (т.е. задать p как список) и всё работало
regall
Сделайте вначале тела функции value
global p
Но алгоритм все равно не работает
Zubchick
а в чем проблема то, что она рекурсивная, передавай 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
Но алгоритм все равно не работает
и это тоже, но просили на алгоритм не смотреть)

И все же я считаю эту глобализацию внутри функций мировым злом!
Ed
Передача mutable в качестве параметра по умолчанию тоже зло еще то. А изменение его внутри функции еще добавляет зла.
Zubchick
Передача mutable в качестве параметра по умолчанию тоже зло еще то. А изменение его внутри функции еще добавляет зла.
а в чем беда?
Леонид
всё!!!!!!!!!!! спасибо всем! написал global p и мне явилась ошибка:

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

т.е. global p не требуется и достаточно заменить строку на p += 1 ))
очепятался я.
Ed
Zubchick
а в чем беда?
Беда в том, что такая практика порождает гораздо более непонятные ошибки, чем даже применение global. Так что вы учите людей плохому.
Попробуйте вызвать свою функцию flat с одним параметром 2 раза и посмотреть на результат. Уверяю, вы будете удивлены.
regall
Ed
Беда в том, что такая практика порождает гораздо более непонятные ошибки, чем даже применение global.
+
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB