Python作用域

什么是作用域

作用域就是指命名空间,python创建、改变或查找变量名都是在所谓的命名空间中。变量在赋值创建时,python中代码赋值的地方决定了这个变量存在于哪个命名空间,也就是它的可见范围。在Python中,只有模块(module),(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如if、try、for等)是不会引入新的作用域的。

作用域的类型

Python变量作用域可以分为四种,分别为局部作用域、嵌套作用域、全局作用域、内置作用域;四种作用域中变量的调用顺序采取“就近原则”,即 LEGB法则。

Python作用域_第1张图片

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)中查找,查找不到则报错。

Python作用域_第2张图片

 

你可能感兴趣的:(Python,python)