5.1 Python3 命名空间和作用域

命名空间(Namespace)是从名称到对象的映射,大部分的命名空间都是通过 Python 字典来实现的。

命名空间提供了在项目中避免名字冲突的一种方法。各个命名空间是独立的,没有任何关系的,所以一个命名空间中不能有重名,但不同的命名空间是可以重名而没有任何影响。


目录

1. 命名空间(Namespace)

1.1 命名空间的类型

1.2 命名空间的访问顺序

2. 作用域(Scope)

2.1 作用域类型

2.2 作用域相关关键字

3. 命名空间与作用域的重要特性

4. 示例代码


1. 命名空间(Namespace)

命名空间是变量名到对象的映射,Python 使用命名空间来组织变量名,避免命名冲突。

1.1 命名空间的类型

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

    • 包含 Python 内置函数和异常名称

    • 在解释器启动时创建,程序退出时销毁

    • 如 print()len()TypeError 等

  2. 全局命名空间(Global Namespace):

    • 包含模块级别定义的名称

    • 在模块被导入时创建,通常持续到解释器退出

    • 包括模块中定义的函数、类、变量等

  3. 局部命名空间(Local Namespace):

    • 包含函数内部定义的名称

    • 在函数调用时创建,函数返回或抛出异常时销毁

    • 包括函数的参数和局部变量

1.2 命名空间的访问顺序

Python 使用 LEGB 规则查找名称:

  1. Local - 当前函数/方法内部

  2. Enclosing - 闭包函数外围

  3. Global - 模块级别

  4. Built-in - 内置名称

x = 'global x'

def outer():
    x = 'outer x'
    
    def inner():
        x = 'inner x'
        print(x)  # 输出 'inner x' (Local)
    
    inner()
    print(x)  # 输出 'outer x' (Enclosing)

outer()
print(x)  # 输出 'global x' (Global)
print(len)  # 输出 <built-in function len> (Built-in)

2. 作用域(Scope)

作用域是命名空间可直接访问的代码区域,决定了变量的可见性。

2.1 作用域类型

  1. 局部作用域(Local Scope):

    • 在函数内部

    • 只能访问局部变量

  2. 闭包作用域(Enclosing Scope):

    • 对于嵌套函数,外部函数的作用域

    • 使用 nonlocal 关键字修改

  3. 全局作用域(Global Scope):

    • 模块级别

    • 使用 global 关键字在函数内修改全局变量

  4. 内置作用域(Built-in Scope):

    • 最外层,包含内置名称

2.2 作用域相关关键字

  1. global:

    x = 10
    
    def modify_global():
        global x
        x = 20
    
    modify_global()
    print(x)  # 输出 20
  2. nonlocal (Python 3+):

    def outer():
        x = 10
        
        def inner():
            nonlocal x
            x = 20
        
        inner()
        print(x)  # 输出 20
    
    outer()

3. 命名空间与作用域的重要特性

  1. 命名空间是动态的:

    • 可以在运行时添加、修改命名空间中的名称

    • 使用 globals() 和 locals() 函数访问对应命名空间的字典

  2. 每个模块有自己的全局命名空间:

    • 不同模块的同名变量不会冲突

  3. 类定义会创建新的命名空间:

    • 类属性存储在这个命名空间中

  4. 实例有自己的命名空间:

    • 实例属性存储在实例的命名空间中

4. 示例代码

# 命名空间示例
def namespace_demo():
    print("局部命名空间:", locals())
    print("全局命名空间:", globals())

namespace_demo()

# 作用域链示例
x = 'global'

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

outer()
print("global:", x)

# 修改作用域变量
def scope_modification():
    global x
    x = 'modified global'
    
    def inner():
        nonlocal y  # 这里会报错,因为没有外围非全局作用域
        y = 20
    
    y = 10
    inner()
    print(y)

scope_modification()
print(x)

理解 Python 的命名空间和作用域对于编写清晰、可维护的代码非常重要,特别是在处理大型项目时。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值