Python 中全局变量的用法

Python 中全局变量的用法

Python 查找变量是顺序是:先局部变量,再全局变量。因此在一个文件中,即使函数中没有定义变量,只要在函数外部定义了变量,则函数一样可以调用。

def f():
    print(a)

a = 1
f()
>>> 1

上面的例子中,f() 函数内部没有变量 a,因此将调用外部变量。

def f():
    a = 2
    print(a)

a = 1
f()
print('a:',a)
>>> 2
>>> a: 1

当函数内部定义了变量,则优先调用内部变量。函数内部的变量是局部变量,不会影响函数外的变量。如果外部没有定义变量 a,则外部变量打印是会报错。

def f():
    a = 2
    print(a)

f()
print('a:',a)
>>> 2
>>> Traceback (most recent call last):
    File "C:\ss.py", line 6, in <module>
    print('a:',a)
    NameError: name 'a' is not defined

如果希望内部函数的变量可以在外部起作用,可以使用 global 命令在变量定义前首先进行声明。这时在外部调用就正常了。

def f():
    global a
    a = 2
    print(a)

f()
print('a:',a)
>>> 2
>>> a: 1

因此,复杂一点的例子是函数的套用:

def f():
    a = 1
    def g():
        print(a)
    return g()

f()
>>> 1

调用 f() 函数后,返回 g()函数,g() 函数要打印变量 a,自己函数中未定义,则像上一层中查找,找到后打印出来。可以想象,如果 g() 函数中定义了变量 a,则优先打印该变量值。

def f():
    a = 1
    def g():
        a = 2
        print(a)
    return g()

f()
>>> 2

类似的,如果两个函数中都没有定义变量 a,则会向外部查找。

def f():
    def g():
        print(a)
    return g()

a = 1
f()
>>> 1

以上情况可以用在函数之间的参数传递上,如果函数外部已经定义了变量,且只希望函数利用该变量而不希望改变该变量,则不必须显示传递该变量到函数中,函数运行时会自动查找调用的。