Python嵌套函数中的global的行为

时间:2018-08-02 05:17:09

标签: python-3.x scope global-variables

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的单个副本。不是吗?

2 个答案:

答案 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