Ваш код не делает то, что вы думаете, и нет никакого способа изменить его, сделайте то, что вы описываете. Вы не можете «вернуть» то, что делает globals
, так как это не имеет никакого эффекта во время выполнения.
Ключевое слово global
интерпретируется в время компиляции , поэтому в первой строке f()
, где вы устанавливаете x = 12
, это модифицирует глобальный x
, так как компилятор определил x
относится к x
в глобальном пространстве имен во всей функции, а не только после оператора global
.
Вы можете легко проверить это:
>>> def g():
... x = 12
... y = 13
... global x
... print "locals:",locals()
...
<stdin>:4: SyntaxWarning: name 'x' is assigned to before global declaration
>>> g()
locals: {'y': 13}
Функция locals()
дает нам представление о локальном пространстве имен, и мы видим, что там нет x
.
В документации говорится следующее :
Имена, перечисленные в операторе global
, не должны использоваться в том же кодовом блоке, текстуально предшествующем инструкции global
.
Имена, перечисленные в операторе global
, не должны определяться как формальные параметры или в for
целевом элементе управления циклом, class
определении, определении функции или import
операторе.
Текущая реализация не применяет последние два ограничения, но программы не должны злоупотреблять этой свободой, так как будущие реализации могут применять их или молча менять значение программы.
Просто дайте локальной переменной другое имя.