Страницы

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

четверг, 5 декабря 2019 г.

Использование global в Python

#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

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

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