当前位置: 首页 > news >正文

Python作用域知识梳理

作用域指变量 / 函数的 “有效访问范围”,Python 按 “就近原则” 查找变量,核心分为 4 类,关键规则用 “查找顺序” 和 “修改权限” 两点讲透:
 

一、4 类基本作用域(LEGB 查找顺序)

Python 访问变量时,会按以下顺序逐层查找,找到即停止,找不到则报错:
 
  1. L(Local,局部作用域):函数 / 方法内部定义的变量(如函数内用 a = 1 定义的变量),仅在当前函数内有效。
  2. E(Enclosing,嵌套作用域):外层嵌套函数的作用域(如函数 A 里嵌套了函数 B,B 可访问 A 内定义的变量)。
  3. G(Global,全局作用域):单个 .py 文件内、所有函数 / 类之外定义的变量(如文件最顶部写 a = 1),整个文件内的函数 / 类可访问。
  4. B(Built-in,内置作用域):Python 自带的内置函数 / 变量(如 print()len()True),无需定义可直接用。
 

二、核心规则:“读” 和 “改” 的权限差异

这是最容易踩坑的点,关键看变量是 “读取值” 还是 “修改值”:
 

1. 读取变量:默认按 LEGB 顺序查找,无需额外声明

  • 局部作用域可直接读嵌套 / 全局 / 内置变量(只要外层有定义)。
     
    例:
     
    global_a = 10  # 全局变量
    def func():print(global_a)  # 读全局变量,无需声明,输出 10
    func()

2. 修改变量:必须用关键字声明 “要修改的是外层作用域变量”

  • 修改全局变量(Global):函数内要给全局变量赋值(如 global_a = 20),必须先写 global 变量名 声明,否则会被当成 “局部变量”。
     
    例(正确写法):
     
    global_a = 10
    def func():global global_a  # 声明“要修改全局变量”global_a = 20    # 真正修改全局变量
    func()
    print(global_a)  # 输出 20
     
  • 修改嵌套作用域变量(Enclosing):Python 3 用 nonlocal 变量名 声明(Python 2 无此关键字),作用是 “修改外层嵌套函数的变量”,而非创建局部变量。
     
    例:
     
    def outer():enclosing_a = 10def inner():nonlocal enclosing_a  # 声明“要修改嵌套变量”enclosing_a = 20inner()print(enclosing_a)  # 输出 20(嵌套变量被修改)
    outer()
     
  • 局部变量(Local):直接赋值即可,无需声明(如 local_a = 5),仅在当前函数内有效。
 

三、常见误区总结

  1. 误区:“同一文件内的全局变量,函数里直接赋值就能改” 
    错!不写 global 时,函数内的 变量名 = 值 会创建 “局部变量”,和外层全局变量同名但无关,相当于 “新变量覆盖了外层变量的访问”。
  2. 误区:“只有跨文件才需要 global” 
    错!global 作用是 “告诉 Python:我要改的是当前文件的全局变量”,和是否跨文件无关,仅和 “是否在函数内修改全局变量” 有关。
http://www.zskr.cn/news/15034.html

相关文章:

  • 论文速读记录 | 2025.10
  • 6 种常见 AI 编程协作便捷的方法总结
  • DeploySharp开源发布:让C#部署深度学习模型更加简单
  • 【Linux】【硬件向】从“找文件”到“懂磁盘”:一文搞懂文件、磁盘与文件系统 - 指南
  • 题解:CF1770H Koxia, Mahiru and Winter Festival
  • HarmonyOS之LocalStorage - 详解
  • 国庆集训DAY2
  • 开源 C# 飞快研发(十三)进程--管道通讯
  • PINN训练新思路:把初始条件和边界约束嵌入网络架构,解决多目标优化难题
  • 临项交换
  • 华为设备MSTP - 指南
  • 04. 布局管理
  • VUE - 实战 2
  • 2025/9/29
  • tcp与udp 协议 - 摘星
  • 如何找出集合的两个子集使得和相等?
  • Python语言自动玩游戏的俄罗斯方块游戏程序代码QZQ
  • Spring AI(七)Spring AI 的RAG搭建集合火山向量模型+阿里云Tair(企业版)
  • 禁止DataGridView自动根据数据源的结构生成列
  • 基于Java+SSM+Django宠物医院信息管理系统(源码+LW+调试文档+讲解等)/宠物医院软件/宠物医疗管理系统/宠物诊所信息系统/动物医院管理软件/宠物医院信息管理/宠物健康记录系统 - 详解
  • 实用指南:Coze源码分析-资源库-删除数据库-后端源码-基础设施/数据存储层
  • MyBatis缓存架构深度拆解:从PerpetualCache的LRU陷阱到Redis分布式二级缓存防穿透实战 - 详解
  • 9 30 -
  • 8. Spring AI tools/function-call - 教程
  • LeetCode刷题记录----62.不同路径(Medium) - 详解
  • 「补充篇」在Cloudflare上设置并更新SRV记录
  • 2025电源适配器权威推荐榜:高效稳定、安全耐用的优质品牌之
  • 「LUCKY STUN穿透」IPv4和IPv6分离重定向
  • 如何设计出优秀、健壮且易于维护的API——关于HTTP状态码与业务逻辑状态码的处理 - 浪矢
  • 做题记录(Part 1. 基础算法)