深入理解Python中命名空间的查找规则LEGB

深入理解Python中命名空间的查找规则LEGB

在Python中,命名空间是一个存储变量名称和对应值的地方。当我们在代码中引用一个变量时,Python会按照一定的规则来查找该变量所在的命名空间。这个规则被称为LEGB规则,它是指在Python中查找变量时的四个命名空间,按照以下顺序进行查找:

  1. Local(局部)命名空间:这是指函数内部定义的变量。当我们在函数内部引用一个变量时,Python首先会在函数的局部命名空间中查找该变量。

  2. Enclosing(嵌套)命名空间:这是指包含当前函数的外部函数的命名空间。如果在函数内部无法找到变量,Python会继续在外部函数的命名空间中查找。

  3. Global(全局)命名空间:这是指模块级别定义的变量,也就是在函数外部定义的变量。如果在函数内部和外部函数的命名空间中都找不到变量,Python会继续在全局命名空间中查找。

  4. Built-in(内置)命名空间:这是指Python内置的函数和模块中定义的变量。如果在前面的三个命名空间中都找不到变量,Python会最后在内置命名空间中查找。

下面是两个示例来说明LEGB规则的查找过程:

示例一

x = 10  # 全局命名空间

def foo():
    x = 20  # 局部命名空间
    print(x)  # 在局部命名空间中找到x,输出20

foo()

在这个示例中,我们定义了一个全局变量x,并在函数foo内部定义了一个同名的局部变量x。当我们调用foo函数时,Python首先在foo函数的局部命名空间中查找变量x,因此输出结果为20。

示例二

x = 10  # 全局命名空间

def outer():
    x = 20  # 嵌套命名空间

    def inner():
        x = 30  # 局部命名空间
        print(x)  # 在局部命名空间中找到x,输出30

    inner()

outer()

在这个示例中,我们定义了一个全局变量x,并在函数outer内部定义了一个同名的嵌套变量x。在outer函数内部,我们又定义了一个同名的局部变量x。当我们调用outer函数时,Python首先在outer函数的局部命名空间中查找变量x,因此输出结果为30。

总结一下,LEGB规则是Python中变量查找的顺序,按照局部、嵌套、全局和内置的顺序进行查找。了解这个规则可以帮助我们更好地理解Python中的命名空间和变量作用域。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入理解Python中命名空间的查找规则LEGB - Python技术站

(0)
上一篇 2023年8月20日
下一篇 2023年8月20日

相关文章

  • mybatis中的if-else及if嵌套使用方式

    MyBatis中的if-else及if嵌套使用方式 在MyBatis中,我们可以使用<if>元素来实现条件判断,以及使用<choose>和<when>元素来实现if-else逻辑。下面将详细介绍这些用法,并提供两个示例说明。 if-else使用方式 使用<if>元素可以在SQL语句中添加条件判断。下面是使用if…

    other 2023年7月28日
    00
  • python 全局变量的import机制介绍

    Python 全局变量的 import 机制介绍 在 Python 中,全局变量是在模块级别定义的变量,可以在整个模块中访问。当我们在一个模块中定义了全局变量,并且想在另一个模块中使用它时,我们需要使用 import 语句来引入该变量。本文将详细介绍 Python 中全局变量的 import 机制,并提供两个示例来说明。 1. import 语句的基本用法 …

    other 2023年7月29日
    00
  • keil5创建基于rtx的stm32工程(转载+自己的体会)

    Keil5创建基于RTX的STM32工程(转载+自己的体会) RTX是一款由Keil开发的嵌入式操作系统,提供了一套完整的多线程编程解决方案,适用于多个主流处理器平台,其中包括ST的STM32平台。在Keil5中,创建基于RTX的STM32工程也是非常简单的。本文将介绍如何使用Keil5来创建一个基于RTX的STM32工程,并分享一些自己的经验和体会。 步骤…

    其他 2023年3月29日
    00
  • Android开发之Socket通信传输简单示例

    下面是针对“Android开发之Socket通信传输简单示例”的完整攻略: 1. 简介 本示例将介绍如何使用Android开发中的Socket通信来进行数据传输,其中Android作为客户端发送数据,Java服务器进行接收和处理数据。 2. 创建服务器端 首先,我们需要在Java中创建一个服务器端,用于接收来自Android客户端的数据。代码如下: impo…

    other 2023年6月27日
    00
  • Android 图片切换器(dp、sp、px) 的单位转换器

    Android 图片切换器(dp、sp、px)的单位转换器攻略 在Android开发中,我们经常需要在不同的屏幕尺寸和像素密度下进行图片切换。为了适应不同的设备,我们需要使用不同的单位来定义图片的尺寸。在Android中,常用的单位有dp(density-independent pixels)、sp(scaled pixels)和px(pixels)。下面是…

    other 2023年9月5日
    00
  • 关于java:为charset.forname(string)编码charsetnames

    关于Java: charset.forName(String)编码charsetNames的完整攻略 在Java中,我们可以使用Charset.forName(String)方法来获取指定编码名称的Charset对象。该方法接受一个字符串参数,该参数指定要获取的编码名称。在本攻略中,我们将详细讲解如何使用Charset.forName(String)方法来获…

    other 2023年5月9日
    00
  • 安卓序列化漏洞 —— CVE-2015-3525

    安卓序列化漏洞 —— CVE-2015-3525 什么是序列化漏洞? 序列化是将对象转换为字节流的过程,便于进行网络传输或存储。而序列化漏洞则是指在对象反序列化时候,由于缺少足够的校验和过滤,导致攻击者可以通过构造恶意数据来实现远程代码执行、拒绝服务等攻击方式。 在实际应用中,序列化漏洞主要出现在Java和.NET等语言中,而安卓序列化漏洞也是针对Java序…

    其他 2023年3月28日
    00
  • mysql中json类型字段的基本用法实例

    下面给出“mysql中json类型字段的基本用法实例”的完整攻略。 什么是MySQL中的JSON类型字段 MySQL中的JSON类型字段是在MySQL 5.7版本中引入的一种新类型,它允许在表格中存储和操作JSON格式的数据。当我们需要在数据库中存储非结构化数据,或者需要在一个数据表格中存储复杂数据结构时,JSON类型字段可以发挥很大的作用。 如何在MySQ…

    other 2023年6月25日
    00
合作推广
合作推广
分享本页
返回顶部