#python
Здравствуйте, знакомлюсь с 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('\n') j.write(str(urokb_in)) j.write('\n') 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
Ответы
Ответ 1
Если не указать 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"Ответ 2
Инструкция global используется там где необходимо явно указать на то, что следует использовать объект из глобальной области видимости (namespace модуля или словарь globals) и отменяет стандартный механизм поиска для переменной (LEGB), дополнительно к этому даёт возможность изменения объекта не в своей области видимости. требует дисциплины в общем то, так как если до объявления global a во вложенной области видимости имени а не было в OВ globals() она будет создана при первой операции присваивания и не пропадёт при завершении работы (к примеру функции). dir() # ['__builtins__'] def foo(): global a a = 22 pass dir() # ['__builtins__', 'foo'] # foo необходимо вызвать. foo() dir() # ['__builtins__', 'a', 'foo'] a # 22 # а теперь живет в globals() def foo1(): print(a) foo1() # 22 # по правилу LEGB имя а было найдено в globals() def foo2(): a += 4 pass foo2() # Traceback (most recent call last): # File "", line 1, in# File "", line 2, in foo2 # UnboundLocalError: local variable 'a' referenced before assignment # запрещено изменение переменных не в своей области видимости для этого # требуется сначала указать что нужно изменить именно a из globals() def foo3(): global a a += 4 foo3() a # 26 Ответ 3
Указывать глобальную переменную нужно непосредственно в теле функции в самом начале, например: x = 1 def set_value(): global x x = 2 print(x) >>> 1 set_value() print(x) >>> 2
Комментариев нет:
Отправить комментарий