def f():
x=42
def g():
global x
x=43
print("Before calling g:",x)
print("Calling g now")
g()
print("After calling g:",x)
f()
print("x in main:",x)
输出:
Before calling g: 42
Calling g now
After calling g: 42
x in main: 43
我的问题是尽管将x声明为全局变量,但为什么在调用g()x = 42之后呢?既然声明了x,则全局python应该维护x的单个副本。不是吗?
答案 0 :(得分:2)
在函数g()
中,您将变量x
声明为全局变量。该变量在全局名称空间中尚不存在,因此当给它分配43
时,python在globals()
中创建它。
注意:
函数x
中的变量f()
不是全局变量,它存在于该函数的本地命名空间中。
要从功能x
访问在功能f()
中声明的变量g()
,请在功能x
g()
中声明变量nonlocal
。
编辑:
示例1: x是全局定义的,也是在f()内部定义的
x = 43
def f():
x=42
print(x)
f() # prints 42
print(x) # prints 43
示例2:不是全局定义x,但是在函数f()中x是global
定义的。这意味着当在函数f()中分配给x时,Python将在全局命名空间中创建变量,并且您也可以在函数f()
外部打印它:
def f():
global x
x=42
print(x)
f() # prints 42
print(x) # prints 42
答案 1 :(得分:1)
全局变量是模块级变量。您的变量x
在函数f()
的范围内,因此不是全局变量。在模块级别定义x
,您的代码将按预期工作:
x = 42
def f():
def g():
global x
x=43
print("Before calling g:",x)
print("Calling g now")
g()
print("After calling g:",x)
f()
这将输出:
Before calling g: 42
Calling g now
After calling g: 43