名称空间与作用域

发布时间 2023-12-11 14:41:40作者: 苏苏!!

名称空间与作用域

(1)名称空间

(1)什么是名称空间

  • 名称空间就是存放名字与对象映射/绑定关系的地方名称空间即存放名字与对象映射/绑定关系的地方。

    • 对于x=3
    • Python会申请内存空间存放对象3,然后将名字x与3的绑定关系存放于名称空间中
    • del x表示清除该绑定关系。
  • 在程序执行期间最多会存在三种名称空间

    # x = 3
    # # 开辟一块内容空间存放变量值 3
    # # 用变量名 x 去引用这块内存空间
    # name = 'dream'
    # print(x)
    # del x
    # print(x)
    
    # 内建名称空间 : 伴随Python解释器的启动,自动加载的名称空间和变量名
    # del max
    # print(max([1, 2, 3, 4]))
    
    # 全局名称空间 :伴随Python解释器的开始执行,在内建空间的基础上扩充出来的名称空间
    
    # 自己定义的
    # name = 'dream'
    # 第三方导入的
    # import random
    
    # 局部名称空间 : 伴随着函数或者类的启动而加载的名称空间
    # def index():
    #     x = 3
    #     print(x)
    # index()
    # print(x)
    
    # 程序启动的加载顺序 :
    # 从内建开始(Python解释器自带的名称空间)
    # 其次全局(自己定义的变量名/函数名/类名)
    # 最后局部(定义在函数/类内部的变量名/类名/函数名)
    
    # 寻找一个变量名的加载顺序
    # 先从局部开始找
    # 局部找不到去全局找
    # 全局还找不到就内建
    # name = 'dream'
    # def index():
    #     print(name)
    

(2)变量作用域

  • python变量作用域
    • Local(局部变量)
    • Enclosed(嵌套)
    • Global(全局)
    • Built-in(内置)

(1)Local局部变量

  • Local(局部变量):暂时的存在,依赖于创建该局部作用域的函数。函数存,则局部变量存,函数亡,则局部变量亡。
  • 作用范围:当前整个函数体范围
"""局部变量作用域"""
# 作用范围整个函数
# 定义一个函数,函数内部就是局部作用域
def add():
    #函数内的变量
    a=3
    print(a)

add()
#调用函数之后,找不大a,是因为在全局变量作用域中找不到变量a
print(a)

(2)Enclosed嵌套变量

  • Enclosed(嵌套):一般是在函数中嵌套函数的时候,外层函数的变量作用域。
  • 作用范围:闭包函数
"""嵌套变量作用域"""
def add():
    a=3
    print(f"这是外层的:{a}")
    def su():
        print(f'这是内层:{a}')
    #返回的是函数su的函数地址
    return su
#调用add,函数add返回值是su的函数地址
su=add()
#调用add的返回值(su的函数地址),执行的是su
su()

(3)Global全局变量

  • Global(全局):一般模块文件顶层声明的变量具有全局作用域,从外部来看,模
    块的全局变量就是一个模块对象的属性,仅限于单个模块文件中。
  • 作用范围:当前模块(文件)
"""全局变量作用域"""
# 全局变量作用域,
# 定义在全局的变量,在任意位置都可以调用该变量
a=3
def add():
    print(f'这是add打印的:{a}')


add()
print(a)
# 这是add打印的:3
# 3

(4)Built-in(内置)

  • Built-in(内置):解释器内置的变量,比如int, str等。
  • 作用范围:所有模块(文件)
  • Python中没有块级作用域。
  • 块级作用域:代码块中的变量,比如if、while、for后面的代码

总结

# 【1】全局作用域 :整个当前文件内的所有变量和变量名/函数名/类名 --- 必须先定义才能再调用
# 【2】局部作用域 :定义在外层函数内部/类的内部才能加载到的变量名/函数名/类名 --- 只能在局部内部才能使用
# 【3】嵌套作用域 :定义在内层函数内部的变量名/函数名/类名
# 【4】内建作用域 :随着Python程序启动而自动加载的名称空间

(3)LEGB规范和两个关键字的使用

  • LGEB规则:按照L--->E--->G--->B的顺序查找变量。
    • 也就是,当不同命名空间具有相同变量名称的变量时,我们首先查找局部变量,如果没有查到,再向全局变量查找。

(1)基于命名空间的常见变量类型

  • 局部变量:
    • 在一个函数体的内部定义的变量
    • 作用域为函数内部
    • 查看局部变量命令:locals()
  • 全局变量
    • 在函数体外部,文件最外层定义的变量
    • 作用域为整个文件内部
    • 查看全局变量命令:globals()
  • 注意:
    • 变量访问规则:从内到外
    • 全局变量和局部变量重名时,采用就近原则
a='G全局'
def add():
    a='E局部'
    def su():
        a='E局部2'
        print(f'su打印的a:{a}')
    su()
    print(f'add打印的a:{a}')

add()
print(a)
# su打印的a:E局部2
# add打印的a:E局部
# G全局