什么是作用域
作用域就是指命名空间,python创建、改变或查找变量名都是在所谓的命名空间中。变量在赋值创建时,python中代码赋值的地方决定了这个变量存在于哪个命名空间,也就是它的可见范围。在Python中,只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如if、try、for等)是不会引入新的作用域的。
作用域的类型
Python变量作用域可以分为四种,分别为局部作用域、嵌套作用域、全局作用域、内置作用域;四种作用域中变量的调用顺序采取“就近原则”,即 LEGB法则。
1.局部作用域
指某个函数内部的范围。每次执行函数时都会创建的新命名空间,同一函数不同时间运行其作用域相互独立,不同函数内部可以使用同一变量名。局部作用域内声明的变量名在函数外也可以使用,程序运行过程中两者互不干扰。
- def func():
- a = 0 # 局部变量
- print("func a = ", a)
-
- a = 'Hello Python' # a为全局变量
- func()
- print("函数外 a : ", a)
-
- 输出结果:
- func a = 0
- 函数外 a : Hello Python
2.嵌套作用域
嵌套一般是指一个函数嵌套另一个函数的情况,外层函数包含变量的作用范围称为嵌套作用域; 也可以指一个类中包含多个函数时的情况。
- def func(i):
- a = [1,2]
- def func1():
- a.append(i)
- return a
- return func1
-
- cls = func(1)
- print(cls)
-
- 输出结果:[1,2,1]
3.全局作用域
全局作用域范围指的是在一个py文件内部,在模块顶部声明的即成为全局作用域。全局作用域中的变量在函数中一般是不可更改的,例如整数,字符等,但对于列表和字典来说可以更改。如想引用并改变全局变量,可使用global关键字。
- a = 1 # a为全局变量
-
- def func():
- a = 2 # 局部变量
- a += 1
- print("局部变量 a = ",a)
-
- func()
- print("全局变量 a = ",a)
-
- 输出结果:
- 局部变量 a = 3
- 全局变量 a = 1
列表和字典可更改
- a = [1, 2, 3,4]
- b = {'语文': 100, "数学": 100}
-
- def func():
- a.append(5)
- b.update({"英语": 90})
- print("函数中> a = ", a)
- print("函数中> b = ", b)
-
-
- func()
- print("函数外 a = ", a)
- print("函数外 b = ", b)
-
- 输出结果:
- 函数中> a = [1, 2, 3, 4,5]
- 函数中> b = {'语文': 100, '数学': 100, '英语': 90}
- 函数外 a = [1, 2, 3, 4,5]
- 函数外 b = {'语文': 100, '数学': 100, '英语': 90}
利用global关键字 引用全局变量
- a = 1
-
- def func():
- global a # 在使用a之前用global
- a += 1
- print("函数中> a = ", a)
-
- func()
- print("函数外 a = ", a)
-
- 输出结果:
- 函数中> a = 2
- 函数外 a = 2
4.内置作用域
内置作用域是python事先定义的内置模块,例如built-in 模块内的变量,程序启动之后由python虚拟机自动加载,在程序的任何地方都可以使用,例如print函数,随着解释器存在或消亡。
层级关系
python的四种所用域及其调用顺序,当使用某一变量时,首先在函数内部进行搜索(局部作用域 L),搜索不到便到上层函数或类中进行查找(嵌套作用域 E),再查找不到便到更上层模块中进行查找(全局作用域 G),还查找不到则进入预先定义的(内置作用域 B)中查找,查找不到则报错。