python中,命名空间的划分和变量的作

白癜风诚信坐标企业 http://baidianfeng.39.net/a_cjzz/180416/6169871.html

模块帮助我们搭建大型的项目。变量的作用域的学习,则需要我们对命名空间有深入的认知。

python模块的应用

python中,我们可以通过语句块,函数或方法,类等,来帮助我们组织代码。事实上,模块也是我们常用的代码组织方式。

python中,一个模块事实上就是一个py文件。通常来说,一个python项目是由若干个模块构建而成的。这些模块,有些是我们自己创建的,有些则是调用Python自己提供的标准库,或一些第三方提供的扩展库。

比如,我们可以通过os模块,来获取一些系统信息,如下:

os模块

上面的demo里,通过import导入了模块os,调用时,以os作为前缀,调用了os模块中提供的方法。

以模块名为前缀来调用模块中的变量或方法,是一种常见的使用方式。

需要注意的是,模块导入后,本质是一个对象,变量名即为模块名。所以,如果有程序中,不慎重新定义了一个和模块同名的变量,将导致原模块无效。如下:

变量覆盖了模块

除了直接通过import导入外,还有两种变形有形式。如通过from……import……,可选择性地导入模块中的部分代码,如下:

可选择导入

注意上面的demo,通过选择性导入了getcwd和getenv,在使用时,不可以加os前缀,直接使用。并且,即使os被覆盖,也不会影响到已经导入的内容。

可以用*来表示将一个模块中的所有内容全部导入。这种使用方式,导入的体量效果和importos是相同的,不同点在于,使用时也不可以加模块名的前缀。

全选择导入

通过情况下,我们推荐用第一种方式来进行导入。这是因为,选择性导入会在当前工作模块内引入更多的标识符,这就更容易发生不小心覆盖的情况。

python变量的作用域

变量,可以在任意一个地方定义,比如说代码块,方法,函数,类,模块等。当一个变量被定义在不同位置时,会表现出不同的作用域。

python用命名空间的机制来管理变量的作用域。命名空间是一个抽象的概念,python中,把命名空间分成三块,分别是内置命名空间,全局命名空间和局部命名空间。当尝试解析一个变量时,python会先从局部命名空间中查找该变量,如找不到,再找全局命名空间,最后再找内置命名空间。

根据以上顺序,我们可以抽象地认为,内置命名空间大于全局命名空间,全局命名空间大于局部命名空间。如下:

命名空间抽象

也就是说,python在解析变量时,会从当前语句所有的空间开始找起,如果找不到,再逐层向外。并且,当一个变量定义在内层,在外层是无法找到的(因为不会向里找)。

命名空间的三层划分,是一个笼统抽象的概括,举个实际的例子:在函数外部,无法访问函数内部定义的变量。如下:

错误调用

上面的demo里,在函数外部使用了在函数内部定义的变量,IDEA会有报红提示。如果尝试运行,会得到NameError,名字错误。

在某些语言中,代码块会是一个最内层的命名空间,如Java,但是在python中,不存在这一层,这意味着,下面的代码是可以正常运行的。如下:

代码块

在内层空间中,可以定义一个和外层空间同名的变量,这样,可以覆盖掉外层空间变量在当前空间的影响。如果在内层空间中想要对外层空间中的变量进行操作,则需要借助global或nonlocal关键字的帮助。

global代表全局命名空间中的变量,用于定义全局变量。nonlocal代表当前空间的外层空间,多用于函数或方法嵌套时的情况。如下:

global和nonlocal


转载请注明:http://www.aierlanlan.com/tzrz/1171.html