交互模式下Python函数参数是怎么样传递的的问题( 二 )



【交互模式下Python函数参数是怎么样传递的的问题】 那么如果一段程序中,不同作用域内的几个变量名称相同怎么办?
好问题!这正是python的LEGB变量名搜索机制要解决的问题。
当在python中使用某个变量名时,python按照L-E-G-B的顺序依次搜索四个作用域,L本地作用域,E即上一层def或者lambda的本地作用域,之后是全局作用域G,最后是内置作用域B,并且在第一处能找到作用名的地方停下来,如果变量名在这一次搜索中没有找到,python会报错。
因此按照LEGB法则中规定的变量搜索顺序,在本地作用域中的变量名是会在本地作用域中覆盖在全局作用域和内置作用域中有相同变量名的变量,全局变量名会覆盖内置的同名变量名。
话不多说,上例子
x = 88def func(): x = 99print(x)func()print(x)9988在这一段程序中,本地变量名x覆盖了全局变量名x,此时本地和全局的两个变量虽然都叫x,但他们是完全不同的变量。
def func(): open = 1 open(\u0026#39;test.txt\u0026#39;)func()Traceback (most recent call last): File "E:/12homework/12homework.py", line 5, in \u0026lt;module\u0026gt; func() File "E:/12homework/12homework.py", line 3, in func open(\u0026#39;test.txt\u0026#39;)TypeError: \u0026#39;int\u0026#39; object is not callable这个例子中,本地作用域中的变量名open就覆盖了内置作用域中的变量名open,因此再使用open去打开文件,此时的操作就无法使用,因为文件打开的open函数变量被open=1这个本地数值变量覆盖了。
强调一点:这里我们提到的只是在本地作用域去引用或者覆盖全局变量和内置变量。
但是,请注意!如果试图去修改,即在函数内部试图改变函数外部声明的值,那就得用global和nonlocal关键字了。

global关键字
之前我们说过python中的变量不用声明,直接赋值使用,但是这个global关键字看上去就像一个声明,但是他不是一个类型的声明,而是一个变量命名空间的声明,它告诉python函数打算生成一个或多个全局变量。应用他,就可以在函数内部对全局变量进行引用和修改
x = 88def func(): global x x = 99func()print(x)99在这个例子中,我们对X加了一个global声明,以便在def之内引用并修改位于全局的变量x,而不是产生一个新的本地变量x并将其覆盖

我们再看一个综合的例子,串联起刚刚我们提到的几个知识点
x,y,z = 1,2,3def all_global():global x x = y + zall_global()print(x)5这个例子中,x,y,z都是全局变量,y和z只是引用值,而对于x,我们想改变他的值,因此用了global进行引用声明。

关于数据科学更系统、更深入的探讨可进入我们的专栏《Python数据科学之路》:
酱油哥:来吧,一起踏上Python数据科学之路本专栏模仿美剧剧集编排分为五季,第一季:Python编程语言核心基础、第二季:Python数据分析基本工具、第三季:Python语言描述的数学基础、第四季:机器学习典型算法专题、第五季:实战热点深度应用。


推荐阅读