Python-作用域、globas、locals-Python自学笔记2

Python函数2------作用域、globas、locals

作用域

作用域就是python程序可以直接访问命名空间的正文区域

在一个python程序中,程序的变量并不是在哪个位置都可以访问的,访问权限决定与这个变量实在哪里赋值的。

变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。python的作用域一共有四种,分别是:

  • L(Local):最内层,包含局部变量,比如一个函数/方法内部 (局部作用域)
  • E(Enclosing):嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的
  • G(Global):当前程序的最外层,比如当前模块的全局变量
  • B(Built-in):包含内建的变量/关键字等

此段引用 RUNOOB 的 Python3 教程 Python3 名称空间/作用域

Local(局部)

局部作用域可以引用全局作用域的变量,但是不能直接修改全局作用域的不可变类型变量

实例1:

  • count = 1
    def func():
        count = 100
        print(count)
    func()
    

结果:

  • func >>> 100
    

注意:这并不是修改了全局作用域的变量,是在局部创建了一个新的变量。全局变量并没有被修改。

  • # 在函数调用后打印全局变量count
    print(count)
    # 控制台打印
    >>> 1
    

实例2:

  • count = 1
    def func():
        count += 2
        print(count)
    func()
    

结果:UnboundLocalError: local variable 'count' referenced before assignment

原因:为什么报这个错误,因为局部作用域不能直接改变全局作用域的变量,当python解释器读取到局部作用域时,发现了你对一个变量进行修改操作,解释器会认为你在局部已经定义过了这个局部变量,python在局部没有找到这个变量所以就报错。

不是说python的取值顺序是局部名称空间全局名称空间内置名称空间吗?为什么这次在局部名称空间没有找到就直接报错。

其实这次的报错原因归根到底是解释器的锅,上面提到了,是 解释器认为(仅仅是解释器认为)你在局部已经定义过了这个局部变量 所以python解释器并不会去全局名称空间寻找,只是在局部空间寻找,没有找到就直接报错。

Enclosing (嵌套)

count = 100 # 全局作用域


def func1():
    count_1 = 2  # 对func2函数来说它是 Enclosing 作用域 
    def func2():
        count_2 = 3  # 局部作用域
        print(count_1)
        print(count) 
		
		
func1()

一般出现在一个函数里嵌套了另一个函数,在外层函数的作用域就叫 Enclosing 作用域内层函数的作用域 叫局部作用域

Global (全局)

例如python模块中的全局变量都属于全局作用域,就是在这个python程序中任何地方都能使用这个变量(仅限单个py文件)。

要注意 全局作用域不能使用 引用局部作用域内的任何东西。

Built-in (内置)

系统内置的变量及方法等

创建顺序与搜索顺序

创建各个作用域的创建顺序是:B Built-in → G Global →E Enclosing →L local

搜索顺序刚刚好相反就是前面说的就近原则:简称 LEGB

globals() 方法

globals() 可以获取全局名称空间 字典,该字典记录了当前模块的变量,包括函数、类等以及其他对象的映射关系。

实例:

  • a = "hello"
    b = "python"
    def func():
    	print(a + b)
    print(globals())
    

结果:

  • {'__name__': '__main__', '__doc__': None, '__package__': None, 
      '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x0000022B46F6F880>,
      '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>,
      '__file__': 'C:/Users/XXXXX/Desktop/python_globals.py', '__cached__': None, 
      'a': 'hello', 'b': 'python', 'func': <function func at 0x0000022B48C2F430>}
    
    

locals() 方法

locals() 可以获取临时名称空间 字典,该字典记录了调用该方法的局部作用域内,所有对象的映射关系

实例:

  • def func():
        a = 1
        b = 2
        def fun2():
            pass
        print(locals())
    func()
    

结果:

  • {'a': 1, 'b': 2, 'fun2': <function func.<locals>.fun2 at 0x000002165D77F4C0>}

拓展:

  • locals() 返回的并不是真正的局部名称空间字典,而是局部名称空间字典的拷贝,他并不能代表局部名称空间,所以locals()不能修改局部空间里的对象映射关系。
posted @   假文艺青年。  阅读(116)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示