Python命名空间与作用域深入全面详解

Python命名空间与作用域深入全面详解攻略

Python是一门解释型语言,在执行代码时需要进行解释。在语言中,每一个对象都有一个命名空间。而在程序代码中,每一个名字都属于对应的命名空间。Python中的变量作用域遵循LEGB规则,即从局部作用域开始寻找变量,一直找到全局作用域,如果还未找到,就会报错。

Python命名空间详解

命名空间是Python中的一个虚拟容器,用于存储变量和函数等对象。它们在代码中以字典的方式实现。Python中存在三种命名空间:

  1. 内置命名空间:系统内置的名称在这里被存放。比如,我们使用的print()函数,就是内置命名空间中的对象。
  2. 全局命名空间:模块文件所在的命名空间称为全局命名空间。
  3. 局部命名空间:函数调用时,随函数调用而产生的命名空间称为局部命名空间。

当Python查找某个对象时,会从当前作用域开始,然后由内向外依次在不同的命名空间中查找。如果某个名称没有在当前命名空间中找到,就会去上一级命名空间查找,直到最终抵达内置命名空间。

Python作用域详解

Python中的作用域分为四种:

  1. L (Local):局部变量作用域,仅在函数内部使用。
  2. E (Enclosing):闭包变量作用域,当一个函数存在嵌套关系时,在其中一个函数内部嵌套的函数中使用的变量,称为闭包变量,其作用范围为该闭包内部及其外部函数内部。
  3. G (Global):全局变量作用域,可在模块内任何位置使用。
  4. B (Built-in):内置变量作用域,Python内置的函数和变量名拥有该作用域。

在LEGB规则中,从L开始寻找,如果找不到,就向E寻找;如果E中仍然找不到,则向G中寻找;最后,如果都找不到,则进入B寻找。

示例

a = 10  # a属于全局命名空间

def func1():
    b = 20  # b属于局部命名空间
    def func2():
        c = 30  # c属于内嵌函数中的局部命名空间
        print(a, b, c)
    func2()

func1()  # 结果为10, 20, 30

在这个示例中,我们定义了一个全局变量a,值为10,并在func1()中定义了变量b,值为20。在func2()的内嵌内部定义了变量c,值为30。在func2()中,我们打印了ab,和c的值,最终结果为102030

a = 10  # a属于全局命名空间

def func1():
    a = 20
    print(a)

func1()  # 结果为20

print(a)  # 结果为10

在这个示例中,我们定义了全局变量a,值为10。在func1()中我们定义了变量a,值为20。在func1()中我们打印了变量a,结果为20。在全局范围内我们打印变量a,结果为10

以上就是Python命名空间与作用域的详细介绍及两个示例说明。如果我们对Python命名空间和作用域有进一步的理解,就能更好地开发Python程序。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python命名空间与作用域深入全面详解 - Python技术站

(0)
上一篇 2023年5月13日
下一篇 2023年5月13日

相关文章

  • 浅谈Python中的函数传递问题

    浅谈Python中的函数传递问题 在Python中,函数传递问题是一个常见的话题。在函数调用时,参数可以通过值传递或引用传递。本文将深入探讨Python中的传递问题,包括参数的传递方式、可变对象和不可变对象的区别、以及函数参数的默认值等。 参数的传递方式 在Python中,函数参数可以通过值传递或引用传递。当参数通过值传递时,函数接收到的是参数的副本,而不是…

    python 2023年5月13日
    00
  • 详解Python PIL BoxBlur()方法

    Python PIL库提供了一个BoxBlur方法用于执行图像模糊操作,本文将介绍BoxBlur方法的参数和用法,并提供示例来说明。 BoxBlur方法的参数 BoxBlur方法接受一个参数:半径,用于指定模糊半径,半径越大,图像越模糊。半径必须为正整数。 BoxBlur方法的用法 下面是BoxBlur方法的基本使用方式: from PIL import I…

    python-answer 2023年3月25日
    00
  • Redis中的BigKey问题排查与解决思路详解

    下面是对Redis中的BigKey问题排查与解决思路的详细讲解。 背景 在使用Redis过程中,可能会遇到BigKey的问题。BigKey指的是占用内存很大的Redis Key,当操作这种Key时,会影响Redis的性能,并且可能会导致Redis进程崩溃。 解决思路 步骤一:找出BigKey 找出BigKey是排查问题的第一步。可以使用Redis的命令red…

    python 2023年5月14日
    00
  • 如何在命令行上传递参数而不在python中使用标志

    【问题标题】:How to pass parameters on command line without using flags in python如何在命令行上传递参数而不在python中使用标志 【发布时间】:2023-04-03 13:03:02 【问题描述】: 所以我有我的 main.py 脚本,它基本上将根据命令行上传递的内容运行某些条件语句。例…

    Python开发 2023年4月8日
    00
  • Python中死锁的形成示例及死锁情况的防止

    Python中死锁的形成示例及死锁情况的防止 什么是死锁? 死锁指的是多个进程(或线程)因相互等待对方持有的资源而陷入僵局,无法继续向前执行。在 Python 中,由于 GIL(全局解释器锁)的存在,多线程下使用锁可能会产生死锁问题。 死锁的形成 举一个简单的例子,假设有两个线程 A 和 B,共享着两把锁 lockA 和 lockB。如果线程 A 先锁定了 …

    python 2023年5月13日
    00
  • Python用模块pytz来转换时区

    当我们在处理不同地区的时间时,需要考虑时区的问题。在Python中,有一个名为pytz的第三方模块可以很好地处理时区转换的问题。 下面是一个使用pytz模块来转换时区的完整攻略: 安装pytz模块 运行以下命令来安装pytz模块: pip install pytz 导入pytz模块 在需要使用pytz模块的脚本中,需要先导入该模块: import pytz …

    python 2023年6月2日
    00
  • python安装本地whl的实例步骤

    介绍如下: 安装 python 本地 whl 的实例步骤 1. 下载 whl 文件 首先,需要下载 whl 文件。可以从 PyPI(Python 包索引)上下载,也可以通过其他途径获取。 2. 确定本地 Python 版本以及位数 在下载 whl 文件之前,需要确定本地使用的 Python 版本以及位数(32 位/64 位)。可以通过终端输入以下命令获取: …

    python 2023年5月14日
    00
  • 详解python 字符串和日期之间转换 StringAndDate

    详解Python字符串和日期之间转换:StringAndDate 在Python中字符串和日期之间的转换非常方便,这可以通过内置模块datetime和time来实现。 字符串转日期 当我们要将字符串转换为日期时,我们可以使用strptime()函数来完成。 其中strptime()函数的用法为: datetime.strptime(date_string, …

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