Python中名称空间的分类和
- 1.名称空间的分类
- 闭包特性
- 示例
- 2. 使用和访问变量的顺序(LEGB 规则)
- 示例
1.名称空间的分类
在 Python 中,名称空间(namespace)是一个用于管理变量名称的系统,它确保在不同范围或上下文中使用相同名称不会产生冲突。在 Python 中,名称空间主要分为以下几类:
-
内置名称空间(Built-in Namespace):
- 包含 Python 解释器启动时自动加载的内置函数和异常等,比如
print()、len()、Exception等。 - 在整个程序运行期间始终存在。
- 可以通过
dir(__builtins__)查看所有内置名称。
- 包含 Python 解释器启动时自动加载的内置函数和异常等,比如
-
全局名称空间(Global Namespace):
- 包含在模块级别定义的变量和函数。每个模块都有自己的全局名称空间。
- 变量在模块内一直存在,直到解释器结束。
-
局部名称空间(Local Namespace):
- 包含在函数或方法中定义的变量,这些变量仅在函数的执行过程中有效。
- 当函数被调用时创建,并在函数执行完成后被销毁。
################################################
4. 闭包名称空间(Enclosing Namespace):
- 当函数嵌套时存在于外部函数的局部名称空间中。
- 被内部函数引用,但不在全局或内置名称空间中。
这个用的比较少,稍微展开说一下:
闭包名称空间指的是一种特殊的变量作用域,它出现在嵌套函数中。当一个函数在其外部函数中定义并访问外部函数的变量时,就会形成一个闭包。外部函数的变量被称为被"闭包"在内部函数中的变量。
闭包特性
-
自由变量:闭包允许内部函数访问其外部函数中的变量(这些变量称为自由变量),即使外部函数已经执行完毕并返回。
-
延长生命周期:通常,变量的生命周期结束于函数执行完毕,但在闭包中,自由变量的生命周期被延长,因为它们需要被内部函数使用。这使得内部函数可以在外部函数执行结束后继续使用这些变量。
-
私有状态:闭包可以用于为函数提供私有状态,使得状态信息可以在多次调用中保持。
示例
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',因为在它的局部名称空间中找到了 x。outer() 函数中的 print(x) 输出 'outer x',因为在它的闭包名称空间中找到了 x。最后,最外层的 print(x) 输出 'global x',因为在全局名称空间中找到了 x。
tips:欢迎大家加入群聊共同学习讨论

