Найти - Пользователи
Полная версия: UnboundLocalError
Начало » Python для новичков » UnboundLocalError
1 2 3 4 5
UsCr
Задача:
сгенерировать список из произвольного количества символов, содержащий одно или два двоеточия, находящиеся на случайных местах в списке.

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
Что не так?
Ferroman
Переменную KolDvoetoch нужно инициализировать до того как что-то с ней делать.
UsCr
Ferroman
Переменную KolDvoetoch нужно инициализировать до того как что-то с ней делать.
Разве строка if j%2==0: KolDvoetoch = 2 не инициализирует KolDvoetoch?
P.S.
Пробовал насильно присвоить ей значение 0 перед всеми операциями. Результат аналогичен.
Александр Кошелев
UsCr
Разве строка if j%2==0: KolDvoetoch = 2 не инициализирует KolDvoetoch?
Только в рамках данной функции.
UsCr
Сделал вот так:
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
UsCr
Функция ведь может оперировать переменными, которые инициализированы “выше” неё и на “её уровне”.
Тоесть такой код:
a = "a"
def one(text):
b = str(text)
def two():
a = b
two()
print a
one('Gerasim")
Напечатает Gerasim и не вызовет ошибки. Или я не прав?
igor.kaist
Смотри…
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
UsCr
Хм…Я теперь порядком запутался…
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
тоже не работает.
Сейчас появились дикие идеи вроде передачи значения переменной через файл… Ещё имею некоторые соображения о создании класса, только вот слабо представляю как это реализовать. Там ведь нужно будет учитывать сколько двоеточий уже вставлено в список…
pasaranax
Если ты создаешь переменную внутри функции, то она будет существовать только внутри этой функции.
UsCr
pasaranax
Если ты создаешь переменную внутри функции, то она будет существовать только внутри этой функции.
Только в ней, но не в функциях описанных в ней?

С помощью global заставил её работать, правда оказалось, что там есть ещё ошибка, список генерируется не правильно. Это буду завтра разбирать. У меня остался ещё вопрос: как в данном случае обойтись без 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