Почему я не могу установить глобальную переменную в Python?

Я реализовал это недавно использующее некоторые пользовательские задачи. Проблема, которую я нашел с реализацией этого с ClickOnce, - то, что все Ваши файлы DLL обновляются. Это заставляет обновление ClickOnce загружать все файлы приложения каждое обновление. Это обходит на хороших функций развертывания ClickOnce, где только измененные файлы повторно загружаются в обновлении.

Просто что-то для размышления о при реализации чего-то вроде этого с ClickOnce.

33
задан Eric Leschinski 7 December 2013 в 21:15
поделиться

4 ответа

Вам нужен оператор global :

def foo():
    global G
    if G is None:
        G = 1

В Python переменные , которые вы назначаете , становятся локальными переменными по умолчанию. Вам нужно использовать global , чтобы объявить их как глобальные переменные. С другой стороны, переменные, на которые вы ссылаетесь, но не присваиваете , не становятся автоматически локальными переменными. Эти переменные относятся к ближайшей переменной в охватывающей области.

Python 3.x вводит оператор нелокальный , который аналогичен global , но связывает переменную с ближайшей охватывающей областью. . Например:

def foo():
    x = 5
    def bar():
        nonlocal x
        x = x * 2
    bar()
    return x

Эта функция при вызове возвращает 10.

Вам нужно использовать global , чтобы объявить их как глобальные переменные. С другой стороны, переменные, на которые вы ссылаетесь, но не присваиваете , не становятся автоматически локальными переменными. Эти переменные относятся к ближайшей переменной в охватывающей области.

Python 3.x вводит оператор нелокальный , который аналогичен global , но связывает переменную с ближайшей охватывающей областью. . Например:

def foo():
    x = 5
    def bar():
        nonlocal x
        x = x * 2
    bar()
    return x

Эта функция при вызове возвращает 10.

Вам нужно использовать global , чтобы объявить их как глобальные переменные. С другой стороны, переменные, на которые вы ссылаетесь, но не присваиваете , не становятся автоматически локальными переменными. Эти переменные относятся к ближайшей переменной в охватывающей области.

Python 3.x вводит оператор нелокальный , который аналогичен global , но связывает переменную с ближайшей охватывающей областью видимости. . Например:

def foo():
    x = 5
    def bar():
        nonlocal x
        x = x * 2
    bar()
    return x

Эта функция при вызове возвращает 10.

но связывает переменную с ближайшей охватывающей областью. Например:

def foo():
    x = 5
    def bar():
        nonlocal x
        x = x * 2
    bar()
    return x

Эта функция при вызове возвращает 10.

но связывает переменную с ближайшей охватывающей областью. Например:

def foo():
    x = 5
    def bar():
        nonlocal x
        x = x * 2
    bar()
    return x

Эта функция при вызове возвращает 10.

63
ответ дан 27 November 2019 в 17:49
поделиться

Вам необходимо объявить G как global , но почему: всякий раз, когда вы ссылаетесь на переменную внутри функции, если вы установить переменную в любом месте этой функции, Python предполагает, что это локальная переменная. Поэтому, если локальная переменная с таким именем не существует в этой точке кода, вы получите UnboundLocalError . Если вы действительно хотели обратиться к глобальной переменной, как в своем вопросе, вам понадобится ключевое слово global , чтобы сообщить Python, что вы имели в виду.

Если вы не назначаете переменную где-либо в функция, но доступ только к ее значению, Python будет использовать глобальную переменную с этим именем, если таковая существует. Итак, вы можете сделать:

G = None

def foo():
    if G is None:
        print G

foo()

Этот код печатает None и не вызывает UnboundLocalError.

9
ответ дан 27 November 2019 в 17:49
поделиться

Вы все равно должны объявить G как глобальную из этой функции:

G = None

def foo():
    global G
    if G is None:
        G = 1

foo()
print G

, которая просто выводит

1
8
ответ дан 27 November 2019 в 17:49
поделиться

Определите G как глобальный в функции следующим образом:

#!/usr/bin/python

G = None;
def foo():
    global G
    if G is None:
        G = 1;
    print G;

foo();

Вышеупомянутый python печатает 1 .

Использование таких глобальных переменных - плохая практика, потому что: http://c2.com/cgi/wiki?GlobalVariablesAreBad

2
ответ дан 27 November 2019 в 17:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: