当前位置: 首页 > 后端技术 > Python

图形蟒蛇-命名空间和作用域

时间:2023-03-26 15:27:59 Python

作者:韩信子@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"",line1,inNameError:name'msg_inner'isnotdefined>>>从报错信息来看,msg_inner没有定义,不能使用,因为它是一个局部变量,只能在函数内使用。(1)全局变量和局部变量在函数内部定义的变量具有局部作用域,在函数外部定义的变量具有全局作用域。局部变量只能在声明它们的函数内访问,而全局变量可以在整个程序中访问。调用函数时,函数内声明的所有变量名都将添加到作用域中。以下示例代码:total=0#Thisisaglobalvariable#Writablefunctiondescriptiondefmy_sum(arg1,arg2):#Returnssumof2parameters."total=arg1+arg2#totalisalocalvariablehere.print("Thefunctionisalocalvariable:",total)returntotal#callthesumfunctionmy_sum(10,20)print("Thefunctionisaglobalvariable:",total)上例输出结果:函数为局部变量:30函数外是全局变量:0(2)global和nonlocal关键字当内部作用域要修改外部作用域的变量时,必须使用global和nonlocal关键字。下面的示例代码修改全局变量num:num=1defmy_func():globalnum#需要使用global关键字声明print(num)num=123print(num)my_func()print(num)输出结果上面例子的:1123123如果你想在嵌套作用域(封闭作用域,外部非全局作用域)修改变量需要nonlocal关键字,如下例:defouter_num():num=10definner():nonlocalnum#nonlocalkeyworddeclarationnum=100print(num)inner()print(num)outer_num()上面例子的输出:100100另外还有一个特例,假设运行下面的代码:a=10deftest():a=a+1print(a)test()上面的程序执行,报错信息如下:Traceback(mostrecentcalllast):File"test.py",line7,intest()File"test.py",line5,intesta=a+1UnboundLocalError:localvariable'a'referencedbeforeassignment错误信息是局部作用域引用错误,因为a在测试函数使用局部的,未定义的,并且不能被修改。修改a为全局变量:a=10deftest_global():globalaa=a+1print(a)test_global()执行输出:11也可以通过函数参数传递:a=10deftest_arg(a):a=a+1print(a)test_arg(a)执行输出结果为:113视频教程也可以点这里查看B站有【中英文字幕】的版本https://www.bilibili.com/video...data下载及代码本系列教程的代码可以在ShowMeAI对应的github上下载,在本地python环境下运行即可,会科学上网的宝宝也可以直接使用googlecolab交互运行学习单击一下!本系列教程涉及的Python备忘单可在以下地址下载:Python备忘单扩展参考资料Python教程-Python3文档Python教程-廖雪峰官网ShowMeAI相关文章推荐python基本数据类型python运算符python条件控制和if语句python循环语句pythonwhile循环pythonfor循环pythonbreak语句pythoncontinue语句pythonpass语句python字符串和操作pythonlistpythontuplepython字典pythonsetpython函数python迭代器和生成器Python数据结构Python模块Python文件读写Python文件和目录操作Python错误和异常处理Python面向对象编程PythonNamespaceandScopePythonTimeandDateShowMeAI系列教程推荐图Python编程:从入门到精通系列教程图解数据分析:从入门到精通系列教程ls图解AI数学基础:从入门到大师系列教程图解大数据技术:从入门到大师系列教程