Я реализовал это недавно использующее некоторые пользовательские задачи. Проблема, которую я нашел с реализацией этого с ClickOnce, - то, что все Ваши файлы DLL обновляются. Это заставляет обновление ClickOnce загружать все файлы приложения каждое обновление. Это обходит на хороших функций развертывания ClickOnce, где только измененные файлы повторно загружаются в обновлении.
Просто что-то для размышления о при реализации чего-то вроде этого с ClickOnce.
Вам нужен оператор 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.
Вам необходимо объявить G
как global
, но почему: всякий раз, когда вы ссылаетесь на переменную внутри функции, если вы установить переменную в любом месте этой функции, Python предполагает, что это локальная переменная. Поэтому, если локальная переменная с таким именем не существует в этой точке кода, вы получите UnboundLocalError
. Если вы действительно хотели обратиться к глобальной переменной, как в своем вопросе, вам понадобится ключевое слово global
, чтобы сообщить Python, что вы имели в виду.
Если вы не назначаете переменную где-либо в функция, но доступ только к ее значению, Python будет использовать глобальную переменную с этим именем, если таковая существует. Итак, вы можете сделать:
G = None
def foo():
if G is None:
print G
foo()
Этот код печатает None
и не вызывает UnboundLocalError.
Вы все равно должны объявить G как глобальную из этой функции:
G = None
def foo():
global G
if G is None:
G = 1
foo()
print G
, которая просто выводит
1
Определите 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