Python中LEGB规则 变量查找顺序Local/Enclosing/Global/Builtin详解

python中变量的查找顺序是legb规则。具体来说,1. local:函数内部定义的变量优先被使用,若未赋值前引用会报错;2. enclosing:嵌套函数外层作用域变量可访问,修改需用nonlocal;3. global:模块层级的全局变量,跨模块不可见;4. builtin:内置作用域,包含内置函数和变量,避免覆盖。合理使用作用域和声明关键字能有效避免错误。

在Python中,变量的查找顺序是按照LEGB规则来执行的。简单来说,就是当你在代码中使用一个变量时,Python会按照 Local → Enclosing → Global → Builtin 这个顺序去查找这个变量的值。

这听起来好像挺简单的,但实际写代码的时候,特别是函数嵌套、模块导入混在一起时,很容易出错。下面我们就从几个常见的场景出发,看看LEGB到底是怎么起作用的。

Local:局部作用域优先

Local指的就是函数内部定义的作用域。只要你在一个函数里面用 = 给变量赋值(除非特别说明是global或nonlocal),它就会被认为是局部变量。

举个例子:

立即学习“Python免费学习笔记(深入)”;

def func():    x = 10    print(x)func()

这里打印的是10,没问题。但如果你这样写:

def func():    print(x)    x = 10func()

这时候就会报错:UnboundLocalError: local variable 'x' referenced before assignment

因为Python看到你在函数里给x赋值了,所以它认定x是一个局部变量。但在print的时候还没赋值,就出错了。

建议:

如果你想在函数里使用全局变量,记得加 global 声明。如果你在嵌套函数里想修改外层函数的变量,要用 nonlocal

Enclosing:嵌套函数的外层作用域

Enclosing指的是嵌套函数的外层函数的作用域。这是很多新手容易忽略的地方。

比如:

def outer():    x = "outer"    def inner():        print(x)    inner()outer()

这里inner函数能访问到outer里的x,这就是Enclosing作用域在起作用。

但如果我们在inner里试图修改x呢?

def outer():    x = "outer"    def inner():        x = "inner"        print(x)    inner()    print(x)outer()

结果会是:

innerouter

说明inner里的x是它自己的局部变量,并没有影响到outer里的x。

如果你希望inner修改outer中的x,就要加上 nonlocal

def outer():    x = "outer"    def inner():        nonlocal x        x = "inner"        print(x)    inner()    print(x)outer()

输出:

innerinner

Global:模块层级的全局变量

Global指的是在模块层级(也就是不在任何函数里)定义的变量。

比如:

x = "global"def func():    print(x)func()

这时打印的是 "global",因为func找不到局部变量x,就去全局找。

但如果你在func里重新赋值x,又不加global,那又会触发前面说的那个错误。

常见误区:

模块A导入了模块B,模块B中的函数不能直接访问模块A的全局变量。全局变量不是“整个程序”的变量,而是当前模块下的。

Builtin:内置作用域

Builtin是最底层的作用域,包含了Python自带的一些内置函数和变量,比如 print()len()TrueException 等。

你可以把它理解为“最后兜底”的一层。

比如你写:

print(len("hello"))

这里的 len 就是从Builtin作用域里找到的。

但如果你不小心覆盖了内置变量,可能会出问题:

len = "oops"print(len("hello"))  # 报错:TypeError: 'str' object is not callable

这时候你就把内置的 len 函数覆盖成了字符串,当然就不能用了。

建议:

不要随便用内置名称做变量名。可以用 del len 来恢复,但这只是临时解决办法,最好一开始就避免。

基本上就这些。LEGB规则虽然看起来简单,但在函数嵌套、变量遮蔽等情况下容易让人掉坑。平时写代码时注意变量作用域,合理使用 globalnonlocal,就能避免很多莫名其妙的问题。

以上就是Python中LEGB规则 变量查找顺序Local/Enclosing/Global/Builtin详解的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1362580.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月14日 01:57:40
下一篇 2025年12月14日 01:57:52

相关推荐

  • Python里operator模块 运算符函数化operator的方法替代方案

    在 python 中,operator 模块的替代方案包括:1. 使用 lambda 表达式实现属性获取和基础运算;2. 利用内置函数或列表推导式简化操作;3. 借助 functools.partial 固定参数复用函数;4. 在性能敏感场景使用 numpy 等库进行高效计算。这些方法在不同情境下比…

    好文分享 2025年12月14日
    000
  • Python中socket编程 Python网络编程socket的基础通信模型

    python中网络编程的基础模块是socket,它提供跨平台的底层通信方式。1. socket通信基本流程包括:创建socket对象 → 绑定地址(服务端)或连接服务器(客户端) → 收发数据 → 关闭连接,服务端先启动监听,客户端发起连接后双方通过send和recv交换数据。2. tcp与udp的…

    好文分享 2025年12月14日
    000
  • Python国际化支持 Python多语言文本处理方案

    实现python应用的国际化支持需从字符串翻译、编码处理和本地化格式三方面入手。首先使用gettext模块实现多语言翻译,通过_()包裹字符串生成.po文件并编译为.mo文件;其次确保所有文件读写使用utf-8编码,结合chardet检测第三方数据源编码,统一使用unicode中间处理;最后利用lo…

    2025年12月14日
    000
  • Python里@decorator用法 装饰器语法在Python中的实际应用解析

    装饰器是python中用于扩展函数或类功能的语法糖,本质是接收函数或类并返回新函数或类的可调用对象。1. 装饰器通过@符号应用,如@my_decorator装饰函数等价于将函数传递给装饰器函数并替换原函数;2. 常见用途包括记录日志/执行时间、权限控制、多层装饰器叠加使用,例如log_time装饰器…

    好文分享 2025年12月14日
    000
  • Python推荐系统 Python协同过滤算法实现步骤

    协同过滤推荐系统可通过以下步骤用python实现:1. 数据准备:获取用户-物品评分数据,如movielens等;2. 构建用户-物品矩阵,使用pandas的pivot方法转换数据结构;3. 计算相似度,基于用户或物品,常用余弦相似度或皮尔逊相关系数;4. 预测评分并生成推荐,通过加权平均相似用户评…

    2025年12月14日
    000
  • Python中argparse模块用法 命令行参数解析库argparse的完整指南

    argparse是python中用于解析命令行参数的工具,其基础用法包括:1. 创建argumentparser对象;2. 使用add_argument()定义参数;3. 调用parse_args()解析输入。它支持位置参数、可选参数、默认值及类型校验,例如通过action=”store…

    好文分享 2025年12月14日
    000
  • Python边缘计算 Python本地化数据处理方案

    用#%#$#%@%@%$#%$#%#%#$%@_23eeeb4347bdd26bfc++6b7ee9a3b755dd做边缘计算可行且常见,尤其适合本地快速处理数据、减少云端依赖的场景。其核心在于部署轻量级服务,可选用flask或fastapi搭建简单接口接收传感器数据并进行基础判断和预处理;1. 搭…

    2025年12月14日
    000
  • Python数据结构与算法 Python常见数据结构实现方式

    python内置数据结构包括列表、字典、集合,树和图需手动实现或借助库。1. 列表是动态数组,适合顺序和随机访问,但频繁在头部插入元素建议用collections.deque;2. 字典基于哈希表,平均时间复杂度为o(1),支持键值对存储,可保持插入顺序;3. 集合用于去重和集合运算,判断元素是否存…

    2025年12月14日
    000
  • Python中如何写入文件?

    在python中,文件写入可以通过’w’模式覆盖写入和’a’模式追加写入实现。1. 使用’w’模式覆盖写入:with open(‘example.txt’, ‘w’) as fil…

    2025年12月14日
    000
  • Python中inspect模块 代码自省inspect的元编程实用技巧

    inspect模块在python中用于分析和操作代码结构,能获取函数名、调用栈、参数签名、类成员及源码等信息。1.使用inspect.stack()可获取调用栈信息,如当前函数被谁调用;2.inspect.signature()可动态分析函数参数,适用于编写通用装饰器;3.inspect.getme…

    好文分享 2025年12月14日
    000
  • python中float的意思 python浮点数类型说明

    在python中,float代表浮点数类型,用于表示小数。1)浮点数采用ieee 754标准,可能导致精度丢失。2)可以使用decimal模块进行高精度计算。3)浮点数比较应使用math.isclose()函数。4)避免用浮点数进行财务计算,建议使用decimal或整数。 在Python中,floa…

    好文分享 2025年12月14日
    000
  • Python数学建模 Python科学计算与仿真案例分析

    python非常适合数学建模和科学计算,掌握numpy、scipy、matplotlib/s seaborn 和 sympy 等核心库即可高效开展工作。1.numpy 是数值计算的基础,支持矩阵运算、线性代数操作和随机抽样;2.scipy 提供科学计算工具,包括积分、优化、插值和统计分析,适合仿真建…

    2025年12月14日
    000
  • Python里协程实现原理 从生成器到async/await的协程发展史

    python协程的实现经历了三个阶段:生成器、基于生成器的协程和async/await。最初,生成器通过yield和.send()实现了基本的协程功能,具备暂停、恢复及双向通信能力;随后,@asyncio.coroutine装饰器配合yield from实现了异步任务调度,但仍存在语法不直观、需手动…

    好文分享 2025年12月14日
    000
  • Python中tf指什么 tensorflow库在Python中的常见缩写tf说明

    在python中,tf是tensorflow库的常用缩写。1. tensorflow是由google开发的开源机器学习框架,用于构建和训练深度学习模型,支持张量计算、自动微分和分布式计算;2. 使用“import tensorflow as tf”导入该库后,可通过“tf.”调用其功能,提升代码简洁…

    好文分享 2025年12月14日
    000
  • Python中Dunder方法 特殊方法__xx__在Python中的运算符重载

    dunder方法是python中以双下划线开头和结尾的特殊方法,用于实现类的运算符重载和内置行为。它们让自定义类可以支持如加法、比较、字符串表示等操作,例如\_\_add\_\_实现加法,\_\_eq\_\_和\_\_lt\_\_实现等于和小于比较,\_\_len\_\_实现长度获取。使用时需注意:…

    好文分享 2025年12月14日
    000
  • Python里PIL库是什么 图像处理库Pillow的前身PIL功能解析

    pil库是python早期用于图像处理的标准库,全称python imaging library,提供图像打开、修改、保存等功能。现在普遍使用pillow的原因在于原pil项目停止更新,而pillow作为其继承者持续维护,兼容其api并改进了python 3支持和功能扩展。pillow支持多种图像格…

    好文分享 2025年12月14日
    000
  • 怎样在Python中处理表单数据?

    在python中处理表单数据可以使用flask和django框架。1) flask通过request对象获取表单数据,并进行基本验证。2) django使用forms模块定义表单类,提供高级验证和数据清理功能,提高安全性和简化前端开发。 在Python中处理表单数据是开发Web应用的常见任务。无论你…

    2025年12月14日
    000
  • Python中猴子补丁原理 运行时动态修改类的monkey patch技术解析

    猴子补丁是指在程序运行过程中动态修改类或模块行为的技术,不改变原有源代码,而是通过替换函数、方法或属性来临时“打补丁”。1. 它利用了python作为动态语言的特性,允许在运行时修改对象结构,例如替换类的方法;2. 典型应用场景包括修复第三方库的bug、测试中模拟行为(mock)以及临时扩展功能避免…

    好文分享 2025年12月14日
    000
  • pycharm安装选项怎么选 安装配置选择建议

    选择pycharm时,社区版适合大多数python开发,专业版适用于web框架和数据科学。安装时创建快捷方式并使用默认路径。配置全局python解释器或为每个项目使用虚拟环境。选择darkula主题,安装git integration和codeglance插件。遵循pep 8标准并启用自动格式化。优…

    2025年12月14日
    000
  • Python里lambda表达式用法 匿名函数lambda在Python中的使用解析

    lambda表达式是python中创建小型匿名函数的简洁方式,适用于需要临时简单函数作为参数的场景。它使用lambda 参数: 表达式语法,无需def关键字和函数名,自动返回表达式结果。常见用途包括:1. 配合map()对元素逐个处理;2. 与filter()结合筛选元素;3. 在sorted()或…

    好文分享 2025年12月14日
    000

发表回复

登录后才能评论
关注微信