作者:韩信子@ShowMeAI教程地址:http://www.showmeai.tech/tuto...本文地址:http://www.showmeai.tech/article-detail/89免责声明:版权所有,转载请联系平台和作者并注明出处Python命名空间和作用域命名空间和作用域是编程设计中的基本概念。深入理解有助于理解变量的生命周期,减少代码错误。莫名其妙的错误。1.命名空间命名空间,又称名称空间、名称空间或名称空间,是指名称到对象的映射关系,类似于字典中的键值对。Python中的许多名称空间都是使用字典实现的。命名空间提供了一种避免项目中名称冲突的方法。每个命名空间都是独立的,没有任何关系,所以一个命名空间不能重名,但不同的命名空间可以重名,没有任何影响。以电脑文件目录为例,一个文件夹可以包含多个文件夹,每个文件夹的文件名不能相同,但不同文件夹中的文件可以重名。命名空间一般分为三种:内置名(built-innames),Python语言内置名,如函数名abs、char和异常名BaseException、Exception等;全局名(globalnames),模块中定义的名称,记录模块的变量,包括函数、类、其他导入的模块、模块级变量和常量。局部名称(localnames),函数中定义的名称,记录了函数的变量,包括函数的参数和局部定义的变量。(在类中也有定义)命名空间搜索顺序:假设我们要使用变量showmeai,那么Python的搜索顺序是:局部命名空间->全局命名空间->内置命名空间。如果未找到变量showmeai,它将放弃并引发NameError异常:NameError:name'showmeai'isnotdefined。命名空间生命周期:命名空间的生命周期取决于对象的范围。如果对象被执行,命名空间的生命周期结束。因此,我们无法从外部命名空间访问内部命名空间的对象。num1=5defsome_func():#num2isalocalnamenum2=6defsome_inner_func():#num3isanembeddedlocalnamenum3=7如下图所示,同一个对象名可以存在于多个命名空间中。2.作用域作用域是Python程序可以直接访问的命名空间的文字区域。在python程序中,直接访问一个变量,会从内到外访问所有作用域,直到找到,否则会报undefined错误。在Python中,程序变量无法在任何地方访问,访问权限取决于变量赋值的位置。变量的范围决定了程序的哪一部分可以访问哪个特定的变量名。Python中有四种作用域,分别是:L(Local):最内层,包括局部变量,比如函数/方法内部。E(封闭):包含非局部和非全局变量。比如两个嵌套的函数,一个函数(或类)A包含一个函数B,那么对于B中的名字,A中的作用域是nonlocal的。G(Global):当前脚本的最外层,比如当前模块的全局变量。B(Built-in):包含内置变量/关键字等,最终被搜索到。规则顺序:L–>E–>G–>B。本地找不到就本地找(比如闭包),再找不到就全局找,然后你会在内置的。g_count=0#globalscopedefouter():o_count=1#definner()infunctionsoutsidetheclosurefunction:i_count=2#localscopebuilt-inscope是通过一个叫做builtin的标准模块实现的,但是变量名本身没有放入内置范围,因此必须导入文件才能使用它。在Python3.x中,可以使用如下代码查看预定义了哪些变量:>>>importbuiltins>>>dir(builtins)在Python中,只有模块(module)、类(class)和函数(def,lambda)会引入新的作用域,其他代码块(如if/elif/else/、try/except、for/while等)不会引入新的作用域,也就是说这些语句中定义的变量,也可以从外部访问,如下代码:>>>ifTrue:...msg='我是ShowMeAI的会员'...>>>msg'我是ShowMeAI的会员'>>>msg实例中的变量在if语句块中定义,但仍可从外部访问。如果在函数中定义了msg,它是一个局部变量,不能被外部访问:>>>deftest():...msg_inner='IamamemberofShowMeAI'...>>>msg_innerTraceback(最近的calllast):File"
