一、概要
变量的作用域是指变量的作用范围,即定义一个变量后,在哪些地方可以使用这个变量。按照作用域的不同,Python 中的变量可以分为局部变量和全局变量。
二、局部变量
在一个函数中定义的变量就是局部变量(包括形参),其作用域是从定义局部变量的位置至函数结束的位置。
def foo(x):
print('Foo 中的 x:', x)
x = 100
print('Foo 中修改后的 x:', x)
def bar():
x = 10
print('Bar 中的 x:', x)
foo(1000)
print('调用 Foo 后的 x:', x)
bar()
输出结果:
Bar 中的 x: 10
Foo 中的 x: 1000
Foo 中修改后的 x: 100
调用 Foo 后的 x: 10
解析:
- 首先运行 bar() 函数,创建了 bar() 中的局部变量 x,并赋值为10。
- 然后调用 foo()函数,形参为1000,即此时 foo 中的局部变量 x 为1000。
- 打印此时 foo 中的 x,数值为1000。
- 将 foo 中的局部变量 x 重新赋值为100,并打印。
-
- foo 函数运行结束,foo 中的 x 作用结束,所以回到 bar 函数中,打印 bar 中的局部变量 x 为10。
三、全局变量
在所有函数外定义的变量就是全局变量,其在所有的函数中都能使用。
def foo():
print('Foo 中的 x:', x)
def bar():
x = 100
foo()
print('Bar 中的 x:', x)
x = 20
foo()
bar()
foo()
输出结果:
Foo 中的 x: 20
Foo 中的 x: 20
Bar 中的 x: 100
Foo 中的 x: 20
第5行代码实际上是在 bar 函数中定义了一个局部变量 x 并将其赋值为 100,而不是修改全局变量 x 的值。所以无论是在bar 函数内部再调用 foo 函数,还是之后调用 foo 函数,其打印的 x 值都为20。
四、global关键字
如果我们想要在一个函数中对全局变量进行修改,怎么办呢?这个时候就可以使用 global 关键字了。在函数体内定义,并且使用global关键字修饰后,该变量也就变为全局变量。在函数体外也可以访问到该变量,并且在函数体内还可以对其进行修改。
def foo():
print('Foo 中的 x:', x)
def bar():
global x
x = 100
foo()
print('Bar 中的 x:', x)
x = 20
foo()
bar()
foo()
输出结果:
Foo 中的 x: 20
Foo 中的 x: 100
Bar 中的 x: 100
Foo 中的 x: 100
tip:
尽管Python允许全局变量和局部变量重名,但是在实际开发时,不建议这么做,因为这样容易让代码混乱,很难分清哪些是全局变量,哪些是局部变量。
五、nonlocal 关键字
在 Python 中,函数的定义可以嵌套,即在一个函数中包含另一个函数的定义。通过 nonlocal 关键字,可以使内层的函数直接使用外层函数中定义的变量。
不使用 nonlocal 的例子:
def outer():
x = 10
def inner():
x = 20
print('inner 函数中 x 的值为', x)
inner()
print('outer 函数中 x 的值为', x)
outer()
输出结果:
inner 函数中 x 的值为 20
outer 函数中 x 的值为 10
使用 nonlocal 的例子:
def outer():
x = 10
def inner():
nonlocal x
x = 20
print('inner 函数中 x 的值为', x)
inner()
print('outer 函数中 x 的值为', x)
outer()
输出结果:
inner 函数中 x 的值为 20
outer 函数中 x 的值为 20