Страницы

Поиск по вопросам

четверг, 28 марта 2019 г.

Использование global в 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('
') 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"

Комментариев нет:

Отправить комментарий