Как сбросить глобальную переменную в python? - PullRequest
6 голосов
/ 07 сентября 2010
SOME_VARIABLE = []

def some_fun:
    append in SOME_VARIABLE
    s = []
    s = SOME_VARIABLE
    SOME_VARIABLE = []  // Not setting to empty list.
    return s

Как сбросить SOME_VARIABLE на пустой.

Ответы [ 4 ]

8 голосов
/ 07 сентября 2010

Если вы читаете переменную, Python ищет ее во всей цепочке областей видимости.Это означает, что:

GLOB_VAR = "Some string"

def some_fun():
    print GLOB_VAR

напечатает Some string

Теперь, если вы пишете в переменную, Python ищет ее в локальной области, и если он не может найти переменную симя, которое вы дали на локальном уровне, затем оно создает его.

Это означает, что в вашем примере вы создали переменную с именем SOME_VARIABLE local для вашей функции some_fun вместо обновления глобальной SOME_VARIABLE.Это классическая ошибка Python.

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

GLOB_VAR = "Some string"

def some_fun():
    global GLOB_VAR
    GLOB_VAR = "Some other string"

some_fun()
print GLOB_VAR

напечатает Some other string.

Примечание: Я считаю, что это способ побудить людей хранить глобальные переменные только для чтения илихотя бы подумать о том, что они делают .

Поведение такое же (чуть более удивительно), когда вы пытаетесь сначала прочитать, а затем записать в глобальный файл.Следующее:

GLOB_VAR = False

def some_fun():
    if GLOB_VAR:
        GLOB_VAR = False

some_fun()

будет повышаться:

Traceback (most recent call last):
  File "t.py", line 7, in <module>
    some_fun()
  File "t.py", line 4, in some_fun
    if GLOB_VAR:
UnboundLocalError: local variable 'GLOB_VAR' referenced before assignment

, поскольку, поскольку мы изменим GLOB_VAR, оно считается локальной переменной.

Обновление: Эли Бендерский имеет подробное сообщение об этом, которое стоит прочитать для более формальных деталей.

6 голосов
/ 07 сентября 2010

Вам нужно сообщить интерпретатору, что вы говорите о глобальной переменной:

def some_fun:
    global SOME_VARIABLE
    ...
    SOME_VARIABLE = []
2 голосов
/ 07 сентября 2010

если вам больше не нужен SOME_VARIABLE, вы можете использовать:

del SOME_VARIABLE

, если вы хотите пустой список:

del SOME_VARIABLE[:]
0 голосов
/ 07 сентября 2010

SOME_VARIABLE является глобальным, поэтому повторное связывание не вступит в силу, если вы не используете global. Но поскольку это изменчивый объект, просто измените его соответствующим образом.

del SOME_VARIABLE[:]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...