python变量的命名空间
首先必须要提一下python程序执行过程中变量的查找规则 较官方的查找机制是: 局部作用域--外部函数作用域--全局作用域--内建函数作用域 其实一般内建函数中的作用域很少会涉及到,因为内建函数其实是一个封装好的实例函数, 它的内部变量一般在函数外部无法获取到 什么是局部作用域,外部函数作用域和全局作用域? 1. 局部作用域 指的是函数内部的作用域 例如: def? fn(a,b,c): ??? d=1 ??? process 函数内的变量d位处的作用域就是函数的内部作用域,另外给fn()传入的参数a,c也位于函数内部的作用域内, 函数一旦调用完毕就会在内存中销毁 2. 外部函数函数作用域 例如: def? fn1(): ?? e=1 ?? def? fn2(): ???? pass 变量e所在的区域,外有fn1包裹,下有fn2函数,变量e所在的作用域就为外部函数作用域,外部函数作用域可以有 多个,这取决于函数有多少层嵌套 3. 全局作用域 例如: f=1 def? fn1(): ?? e=1 ?? def? fn2(): ???? pass (此例在2.中例子基础上增加了变量f) 可见,变量f所在的作用域就是全局作用域,就是没有被函数包裹(即在所有函数之外)的作用域 为什么要区分局部变量和全局变量: 1. 避免变量名的冲突,因为python是一种类型较弱的语言,变量可以随时被赋值和修改为各种类型的数据, 这样容易引起命名上的冲突,局部变量和全局变量的区分使得这种冲突得到缓解 2. 为了提高效率,减少内存的占有,python规定局部变量在函数调用完之后就删除,而全局变量则不会删除 在谈及变量的命名空间这个话题必须要知道的两个语句: global语句和nonlocal语句 global语句 一般条件下,全局作用域内定义的变量在局部变量内是无法修改的,而global语句则例外, 它在函数内部声明一个变量是全局内的变量,需要调用时去全局寻找,因此可以改变全局变量 注意: 要在函数内部声明这个变量,则在全局作用域中要事先定义(赋值)这个变量,同时在这个函数 的局部作用域内不能存在相同变量名的变量,否则程序会出错 nonlocal语句 这个语句跟global语句的功能有些类似,区别在于它是在在局部作用域内改变外部函数作用域的变量 那么在实际应用中这两个语句到底有什么用呢? 举两个简单的例子 1. L=[]??? ? ? #全局变量--一个列表 while?? True:??? #此处暂且定义一个死循环,可以根据实际修改循环条件 ?? def? fn1(): ?? global L??? #在函数内部给列表添加数据 ????????? L.append('abc')?? #abc只是一个例子,每次调用fn1()都可以增添不同数据 在循环内每次调用fn1函数都可以往列表中增添‘abc’字符串,如果L列表定义在函数内部, 则每次调用函数都会初始化列表L,就没有意义了。所以global就有这么一个作用--实现 全局变量在函数内部的修改。 2. a=0 def fn2(): ??? global a ??? a+=1 ??? process fn2() fn2() 这个例子反映global语句的作用是记录函数fn2函数被调用的次数,每次调用fn2函数,a都会自增1 在函数外部可以根据变量a的值知道fn2函数被调用了多少次 nonlocal语句的用法和global语句的用法差不多,读者可以依样画葫芦,敲敲代码就知道怎么用了, 我在这里就不赘述了 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |