1. 命名空间的定义
Python命名空间是名称到对象的映射,这就像是字典,键名是变量名,值是变量的值。比如:
>>> x = 3 >>> globals() {'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, 'x': 3, '__package__': None}
可以看到变量x,3以字典的形式存放在globals空间内。以之对应的名字空间还有:locals()。
>>> locals() {'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, 'x': 3, '__package__': None}
实际上,你可以通过向名字添加键名和值:
>>> globals()['y'] = 5 >>> y 5
2. 命名空间的种类
Python中有三种命名空间:
a) 局部,函数内的命名空间就是局部的;
b) 全局,模块内的命名空间就是全局的;
c) 内置,包括异常类型、内建函数和特殊方法,可以代码中任意地方调用;
下面讨论关于名字空间的搜索顺序,先来看张图:
上图左侧是内置命名空间,右侧是不同的模块,有各自的全局命名空间,全局命名空间内定义函数就会有局部命名空间。
3. 命名空间的可见性(作用域)
a) 内置命名空间在代码所有位置都是可见的,所以可以随时被调用;
b) 全局命名空间和局部命名空间中, 如果有同名变量,在全局命名空间处,局部命名空间内的同名变量是不可见的;
c) 在局部命名空间处,全局命名空间的同名变量是不可见的(只有变量不同名的情况下,可使用 global关键字让其可见)。
知道了可见性,下面说变量的查找顺序就要清楚多了。
4. 命名空间的查找顺序
a) 如果在函数内调用一个变量,先在函数内(局部命名空间)查找,如果找到则停止查找。否则在函数外部(全局命名空间)查找,如果还是没找到,则查找内置命名空间。如果以上三个命名都未找到,则抛出NameError 的异常错误。
b) 如果在函数外调用一个变量,则在函数外查找(全局命名空间,局部命名空间此时不可见),如果找到则停止查找,否则到内置命名空间中查找。如果两者都找不到,则抛出异常。只有当局部命名空间内,使用global 关键字声明了一个变量时,查找顺序则是 a) 的查找顺序。
相关推荐
### Python命名空间与作用域详解 #### 一、Python命名空间 在Python中,命名空间是一个核心概念,它主要用于组织并隔离程序中的不同元素(如变量、函数、类等),从而确保这些元素能够独立地存在,即使它们拥有...
Python中的命名空间与作用域是理解程序执行逻辑和变量访问的关键概念。命名空间是一个存储名字与对象映射的容器,它的主要目的是防止不同区域内的同名变量产生冲突。Python通过不同的命名空间类型来管理这些映射,...
Python中的命名空间和作用域是理解程序执行逻辑和变量访问规则的关键概念。命名空间(Namespace)可以被看作是一个从名字到对象的映射,它决定了变量名如何关联到具体的对象。在Python中,大多数命名空间是通过字典...
Python3 命名空间和作用域 命名空间 先看看官方文档的一段话: A namespace is a mapping from names to objects.Most namespaces are currently implemented as Python dictionaries。 命名空间(Namespace)是从...
目录python3基础篇(九)——命名空间和作用域1 命名空间1.1 命名空间分类1.2 命名空间的查找顺序2 作用域2.1 作用域分类2.2 作用域的查找顺序2.3 global和nonlocal关键字2.3.1 global2.3.1.1 global声明全局变量2.3...
在Python编程中,包、模块、函数和变量作用域是四个至关重要的概念,对于理解和组织代码至关重要。 首先,我们来详细探讨一下“模块”(Module)。在Python中,模块是一个包含Python定义和语句的文件。模块可以定义...
Python中的命名空间和作用域是编程中非常重要的概念,它们对于理解和编写高效、可维护的代码至关重要。命名空间是Python用来管理和组织变量的一种机制,而作用域则是确定变量可访问范围的规则。 首先,我们来看命名...
Python的设计哲学强调代码的可读性和简洁的语法(尤其是使用空格缩进来区分代码块,而不是使用大括号或关键词)。这使得Python被认为是一种易于学习的语言,同时具备强大的功能,适合初学者和经验丰富的程序员。 ...
类的方法的作用域规则和通常函数的一样。 Python会智能地猜测一个变量是局部的还是全局的,它假设任何在函数内赋值的变量都是局部的。 因此,如果要给全局变量在一个函数里赋值,必须使用global语句。 global Var...
命名空间和作用域 我们把命名空间看做一个大型的字典类型(Dict),里面包含了所有变量的名字和值的映射关系。在 Python 中,作用域实际上可以看做是“在当前上下文的位置,获取命名空间变量的规则”。在 Python ...
作用:名称空间可以使栈区中存放相同的名字,从而解决命名冲突 名称空间分为三种: 内置名称空间 全局名称空间 局部名称空间 内置名称空间 内置名称空间:用于存放Python解释器中内置的名字 生命周期:Python...
正确使用作用域和名字空间可以避免命名冲突,提高代码可读性和维护性。在实际编程中,应尽量减少全局变量的使用,充分利用局部作用域来封装变量,以保持代码的整洁和高效。同时,合理利用`global`关键字可以在必要时...
在Python编程中,命名空间(namespace)是一个用于存放变量的虚拟存储区,它和作用域息息相关。本文将详细介绍Python中的命名空间概念,并通过示例代码来进行说明,以供读者参考学习。 首先,命名空间是变量存储的...
4. **局部作用域(Block)名称空间**:虽然不常提及,但Python中的类定义、for循环、if语句等也有自己的作用域,它们构成了局部作用域,其中的变量只在这些结构内部可见。 Python名称空间遵循LEGB规则,即Local -> ...
1 基本概念 1.1 命名空间 (namespace) ...命名空间有不同的创建时间和生命周期: •内置变量命名空间在python解释器启动时创建,并且在解释器运行期间永远不会被删除; •一个模块的命名空间在模块被导入时创建,并且