欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 手游 > Python中名称空间的分类和使用

Python中名称空间的分类和使用

2026/2/1 13:19:17 来源:https://blog.csdn.net/wanganqiqi/article/details/144471202  浏览:    关键词:Python中名称空间的分类和使用

Python中名称空间的分类和

  • 1.名称空间的分类
        • 闭包特性
      • 示例
  • 2. 使用和访问变量的顺序(LEGB 规则)
      • 示例

1.名称空间的分类

在 Python 中,名称空间(namespace)是一个用于管理变量名称的系统,它确保在不同范围或上下文中使用相同名称不会产生冲突。在 Python 中,名称空间主要分为以下几类:

  1. 内置名称空间(Built-in Namespace)

    • 包含 Python 解释器启动时自动加载的内置函数和异常等,比如 print()len()Exception 等。
    • 在整个程序运行期间始终存在。
    • 可以通过 dir(__builtins__) 查看所有内置名称。
  2. 全局名称空间(Global Namespace)

    • 包含在模块级别定义的变量和函数。每个模块都有自己的全局名称空间。
    • 变量在模块内一直存在,直到解释器结束。
  3. 局部名称空间(Local Namespace)

    • 包含在函数或方法中定义的变量,这些变量仅在函数的执行过程中有效。
    • 当函数被调用时创建,并在函数执行完成后被销毁。

################################################
4. 闭包名称空间(Enclosing Namespace)

  • 当函数嵌套时存在于外部函数的局部名称空间中。
  • 被内部函数引用,但不在全局或内置名称空间中。
    这个用的比较少,稍微展开说一下:
    闭包名称空间指的是一种特殊的变量作用域,它出现在嵌套函数中。当一个函数在其外部函数中定义并访问外部函数的变量时,就会形成一个闭包。外部函数的变量被称为被"闭包"在内部函数中的变量。
闭包特性
  1. 自由变量:闭包允许内部函数访问其外部函数中的变量(这些变量称为自由变量),即使外部函数已经执行完毕并返回。

  2. 延长生命周期:通常,变量的生命周期结束于函数执行完毕,但在闭包中,自由变量的生命周期被延长,因为它们需要被内部函数使用。这使得内部函数可以在外部函数执行结束后继续使用这些变量。

  3. 私有状态:闭包可以用于为函数提供私有状态,使得状态信息可以在多次调用中保持。

示例

def outer_function(msg):def inner_function():print(msg)return inner_function# 创建闭包
closure = outer_function("Hello, World!")# 调用闭包
closure()  # 输出: Hello, World!

在这个例子中:

  • outer_function 定义了一个局部变量 msg,并返回了 inner_function
  • inner_function 就是闭包,因为它捕获了 outer_function 的局部变量 msg
  • 即使 outer_function 执行完毕,msg 变量仍然可以通过 closure 被访问。

#######################################################

2. 使用和访问变量的顺序(LEGB 规则)

Python 在查找变量时,会按照 LEGB 规则的顺序查找:

  • Local:先查找局部名称空间,即当前函数或方法中定义的变量。
  • Enclosing:如果局部名称空间没有找到,则查找闭包名称空间,即任何外部封闭函数中定义的变量。
  • Global:如果没有在闭包名称空间中找到,则查找全局名称空间,即模块级定义的变量。
  • Built-in:最后,如果都没有找到,则查找内置名称空间。

示例

# 全局名称空间
x = 'global x'def outer():# 闭包名称空间x = 'outer x'def inner():# 局部名称空间x = 'inner x'print(x)  # 输出 'inner x'inner()print(x)  # 输出 'outer x'outer()
print(x)  # 输出 'global x'

在上面的例子中,inner() 函数中的 print(x) 会输出 'inner x',因为在它的局部名称空间中找到了 xouter() 函数中的 print(x) 输出 'outer x',因为在它的闭包名称空间中找到了 x。最后,最外层的 print(x) 输出 'global x',因为在全局名称空间中找到了 x

tips:欢迎大家加入群聊共同学习讨论
在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词