📜  python 命名空间 - Python (1)

📅  最后修改于: 2023-12-03 15:19:08.233000             🧑  作者: Mango

Python命名空间

在Python中,名称(也称为标识符)是用于标识变量,函数,类等元素的字母,数字和下划线的组合。 Python使用称为“命名空间”的概念来支持这些名称。

命名空间是用于在程序中标识名称的一种机制。它是一种将名称映射到其定义的对象的方式。可以将命名空间想象成字典对象,其中键是名称,值是名称引用的对象。

Python具有四种类型的命名空间:

  1. 内置命名空间 - 包含内置函数和内置对象,例如print,input和str。
  2. 全局命名空间 - 包含定义在模块级的名称。
  3. 局部命名空间 - 包含定义在函数或类方法级别的名称。
  4. 临时命名空间 - 用于实现函数和类中的内部命名空间。
命名空间的查找顺序

在查找名称时,Python按照以下顺序搜索命名空间:

  1. 局部命名空间 - 包含定义在函数或类方法级别的名称。
  2. 全局命名空间 - 包含定义在模块级的名称。
  3. 内置命名空间 - 包含内置函数和内置对象。

如果变量在一个命名空间中找不到,Python会继续搜索更高级别的命名空间,直到找到为止。

以下是示例代码,说明命名空间如何影响变量查找:

x = 10           # 全局命名空间

def foo():
    y = 5        # 局部命名空间
    print(x)     # 在局部命名空间中找不到‘x’,所以去全局命名空间中查找并输出10。
    print(y)     # 直接输出5,因为y在局部命名空间中定义。

foo()            # 输出:10 5

由于Python具有不同级别的命名空间,因此可以在函数或类定义中使用相同的名称而不会发生命名冲突。例如:

x = 10

class MyClass:
    x = 5

    def foo(self):
        x = 2
        print(x)     # 输出:2
        print(self.x) # 输出:5
        print(globals()['x']) # 输出:10,这是全局命名空间中的 'x'值

myobj = MyClass()
myobj.foo()

在此示例中,存在三个不同的"x"变量- 全局变量x,类变量myobj.x和函数变量x。在函数和类方法中使用“self.x”来访问类变量,并使用“globals() ['x']”来访问全局变量。

总结
  • Python使用命名空间来标识名称。
  • 命名空间是映射名称到其定义对象的机制。
  • Python有四种类型的命名空间:内置,全局,局部和临时。
  • Python搜索命名空间的顺序:局部命名空间,全局命名空间,内置命名空间。
  • 可以在不同级别的命名空间中使用相同的名称。