Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 4, 2009 12:02:56

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

UnboundLocalError

Задача:
сгенерировать список из произвольного количества символов, содержащий одно или два двоеточия, находящиеся на случайных местах в списке.

import random
rand = random.randint
randch = random.choice
arr = []

#skolko tut budet dvoetochii:
def HowMuch():
j = rand(0,100)
if j%2==0: KolDvoetoch = 2
else: KolDvoetoch = 1

#generiruem massiv
def generate(KolSymb):
k = ""
def GetDvoetoch():
if KolDvoetoch>0:
KolDvoetoch = KolDvoetoch-1
k = ":"
else: k = randch("abc")

for i in range(KolSymb+1):
j = rand(0,10)
if j==0: GetDvoetoch() #esli ravno 0, vstavit' dvoetochie
else: k = randch("abc")
arr.append(k)

def go(n):
HowMuch()
generate(n)
print arr
При вызове go(10) вываливается ошибка:
Traceback (most recent call last):
File "<pyshell#38>", line 1, in <module>
studmod.go(10)
File "/home/nazarovd/python/studmod.py", line 28, in go
generate(n)
File "/home/nazarovd/python/studmod.py", line 23, in generate
else: GetDvoetoch()
File "/home/nazarovd/python/studmod.py", line 15, in GetDvoetoch
if KolDvoetoch>0:
UnboundLocalError: local variable 'KolDvoetoch' referenced before assignment
Что не так?



Офлайн

#2 Ноя. 4, 2009 12:44:30

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

UnboundLocalError

Переменную KolDvoetoch нужно инициализировать до того как что-то с ней делать.

Офлайн

#3 Ноя. 4, 2009 13:03:43

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

UnboundLocalError

Ferroman
Переменную KolDvoetoch нужно инициализировать до того как что-то с ней делать.
Разве строка if j%2==0: KolDvoetoch = 2 не инициализирует KolDvoetoch?
P.S.
Пробовал насильно присвоить ей значение 0 перед всеми операциями. Результат аналогичен.



Отредактировано (Ноя. 4, 2009 13:04:29)

Офлайн

#4 Ноя. 4, 2009 13:13:33

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

UnboundLocalError

UsCr
Разве строка if j%2==0: KolDvoetoch = 2 не инициализирует KolDvoetoch?
Только в рамках данной функции.



Офлайн

#5 Ноя. 4, 2009 14:41:02

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

UnboundLocalError

Сделал вот так:

import random
rand = random.randint
randch = random.choice
arr = []

#generiruem massiv
def generate(KolSymb):

def HowMuch():
j = rand(0,100)
if j%2==0: KolDvoetoch = 2
else: KolDvoetoch = 1

def GetDvoetoch():
if KolDvoetoch>0:
KolDvoetoch = KolDvoetoch-1
k = ":"
else: k = randch("abc")


k = ""
HowMuch()

for i in range(KolSymb+1):
j = rand(0,10)
if j==0: k = randch("abc")
else: GetDvoetoch()
arr.append(k)
print arr
Ругается так:
Traceback (most recent call last):
File "<pyshell#8>", line 1, in <module>
studmod.generate(10)
File "/home/nazarovd/python/studmod.py", line 27, in generate
else: GetDvoetoch()
File "/home/nazarovd/python/studmod.py", line 15, in GetDvoetoch
if KolDvoetoch>0:
UnboundLocalError: local variable 'KolDvoetoch' referenced before assignment



Отредактировано (Ноя. 4, 2009 14:41:47)

Офлайн

#6 Ноя. 4, 2009 14:50:38

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

UnboundLocalError

Функция ведь может оперировать переменными, которые инициализированы “выше” неё и на “её уровне”.
Тоесть такой код:

a = "a"
def one(text):
b = str(text)
def two():
a = b
two()
print a
one('Gerasim")
Напечатает Gerasim и не вызовет ошибки. Или я не прав?



Отредактировано (Ноя. 4, 2009 14:55:09)

Офлайн

#7 Ноя. 4, 2009 16:40:39

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

UnboundLocalError

Смотри…

a=5
def b():
a=10
print a
b()
print a
тебе нужно сделать так
a=5
def b():
global a
a=10
print a
b()
print a
хотя использование global это не очень хороший стиль программирования
a=5
def b(t):
t+=5
return t
print a
a=b(a)
print a



Отредактировано (Ноя. 4, 2009 16:42:00)

Офлайн

#8 Ноя. 4, 2009 19:25:22

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

UnboundLocalError

Хм…Я теперь порядком запутался…

def GetDvoetoch():
global KolDvoetoch
if KolDvoetoch>0:
KolDvoetoch = KolDvoetoch-1
k = ":"
else: k = randch("abc")
Должно работать? У меня снова не работает. И так:
import random
rand = random.randint
randch = random.choice
arr = []
global KolDvoetoch

#generiruem massiv
def generate(KolSymb):

def HowMuch():
j = rand(0,100)
if j%2==0: KolDvoetoch = 2
else: KolDvoetoch = 1

def GetDvoetoch():
if KolDvoetoch>0:
KolDvoetoch = KolDvoetoch-1
k = ":"
else: k = randch("abcdefghigklmnopqrstuvwxyz")


k = ""
HowMuch()

for i in range(KolSymb+1):
j = rand(0,10)
if j==0: k = randch("abcdefghigklmnopqrstuvwxyz")
else: GetDvoetoch()
arr.append(k)
print arr
тоже не работает.
Сейчас появились дикие идеи вроде передачи значения переменной через файл… Ещё имею некоторые соображения о создании класса, только вот слабо представляю как это реализовать. Там ведь нужно будет учитывать сколько двоеточий уже вставлено в список…



Офлайн

#9 Ноя. 4, 2009 21:19:56

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

UnboundLocalError

Если ты создаешь переменную внутри функции, то она будет существовать только внутри этой функции.



Офлайн

#10 Ноя. 4, 2009 21:54:20

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

UnboundLocalError

pasaranax
Если ты создаешь переменную внутри функции, то она будет существовать только внутри этой функции.
Только в ней, но не в функциях описанных в ней?

С помощью global заставил её работать, правда оказалось, что там есть ещё ошибка, список генерируется не правильно. Это буду завтра разбирать. У меня остался ещё вопрос: как в данном случае обойтись без global?



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version