Здравствуйте, знакомлюсь с python и после c++ категорически не понимаю принцип использования global переменных. Если у переменной, находящейся в def указать global то можно ли её значение использовать вне этой функции, у меня точно не получается. Может просто потому что я новичок и очевидные вещи для меня еще слишком сложны.
def check():
global urokb_in
urokb_in = 1
with open('users.txt', 'r') as f:
line = f.readline()
f.close()
with open('progress.txt', 'r') as k:
while True:
global uroka_in
lines = k.readline()
if line == lines.rstrip():
uroka_in = int(k.readline().rstrip())
urokb_in = uroka_in + 1
uroka_str = str(uroka_in)
urokb_str = str(urokb_in)
lines.replace(uroka_str, urokb_str)
k.close()
break
if not lines:
k.close()
urokb_in = 1
with open('progress.txt', 'a') as j:
j.write(line)
j.write('
')
j.write(str(urokb_in))
j.write('
')
j.close()
break
if urokb_in == 1:
educate__scr = PhotoImage(file='e_scr_1.png')
educate_label = Label(root, image=educate__scr)
educate_label.place(x=0, y=0)
Более опытные кодеры подскажите как исправить.
SyntaxError: name 'urokb_in' is used prior to global declaration
Ответ
Если не указать global или nonlocal, то x = внутри функции создаёт локальную переменную
Если вы хотите новую глобальную переменную создать/или переопределить старую внутри функции (не на глобальном уровне), то можно global использовать. Это может быть полезно при работе с multiprocessing модулем, чтобы унаследовать желаемые глобальные переменные от родительского процесса:
def init(shared_arr_):
global shared_arr
shared_arr = shared_arr_ # must be inherited, not passed as an argument
Полный пример кода
Если вы хотите просто использовать существующую глобальную переменную, не переопределяя её, то global не нужен (иначе к примеру, пришлось бы в каждой функции каждый используемый модуль, каждую глобальную функцию объявлять global).
я новичок и очевидные вещи для меня еще слишком сложны
Для новичков: не переопределяйте глобальные переменные вообще, то есть избегайте global. Считайте каждое появление global в коде ошибкой, если нет особых причин для использования этой конструкции (как в примере с multiprocessing). Если не получается избавится от global, то создайте минимальный пример кода и задайте отдельный вопрос: "как избавиться от global, делая X"
Комментариев нет:
Отправить комментарий