аватар question@mail.ru · 01.01.1970 03:00

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

аватар answer@mail.ru · 01.01.1970 03:00

Если не указать global или nonlocal, то .

Если вы хотите новую глобальную переменную создать/или переопределить старую внутри функции (не на глобальном уровне), то можно 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""

Последние

Похожие