变量的作用域

局部变量和全局变量。

变量的作用域是指变量的作用范围,即定义一个变量后,在哪些地方可以使用这个变量。

按照作用域的不同,Python 中的变量可分为局部变量和全局变量。

例:我们定义并测试一个函数,它读取两个变量的值。

1
2
3
4
5
6
7
8
9
10
# 读取两个变量的值。变量a是函数的参数;变量b,这个函数没有定义它。
def f1(a):
print(a)
print(b)

b = 5
f1(2)

# 2
# 5

局部变量:在一个函数中定义的变量就是局部变量(包括形参),其作用域是从定义局部变量的位置至函数结束位置。

全局变量:在所有函数外定义的变量就是全局变量,其在所有函数中都可以使用。

1
2
3
4
5
6
def f1(a):
print(a)
print(b)

b = 6 #如果先给全局变量b赋值,然后再调用f1,就不会出错。
f1(3)
1
2
3
4
5
6
7
8
9
10
b = 6
def f2(a):
print(a)
b = 7
print(b)
b = 9 # Python编译函数定义体时,判断b是局部变量,因为在函数中给它赋值了。

f2(3)
# 3
# 7

这不是缺陷,而是设计选择:Python 不要求声明变量,但是假定在函数定义体中赋值的变量是局部变量。

global

如果在函数中赋值时想让解释器把 b 当成全局变量,要使用 global 声明:

1
2
3
4
5
6
7
8
9
10
11
b = 6
def f3(a):
global b
print(a)
print(b)
b = 9
f3(3)
b
# 3
# 6
# 9

nonlocal

在Python 中,函数的定义可以嵌套,即在一个函数的函数体中可以包含另一个函数的定义

通过 nonlocal 关键字,可以使内层的函数直接使用外层函数中定义的变量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def outer_function():
counter = 0

def inner_function():
nonlocal counter # 声明 counter 是非局部的
counter += 1
return counter

return inner_function

func = outer_function()
func()
print(func())
# 2

总结:

  1. 局部变量与全局变量。
  2. Python 不要求声明变量,但是假定在函数定义体中赋值的变量是局部变量。
  3. globalnonlocal 关键字。