网站建设经费,电商代运营公司排行榜,深圳教育软件app开发,公司企业策划书模板本篇文章小编给大家分享一下Python变量作用域代码解析#xff0c;文章代码介绍的很详细#xff0c;小编觉得挺不错的#xff0c;现在分享给大家供大家参考#xff0c;有需要的小伙伴们可以来看看。特点python的作用域是静态的#xff0c;在源代码中变量名被赋值的位置决定…本篇文章小编给大家分享一下Python变量作用域代码解析文章代码介绍的很详细小编觉得挺不错的现在分享给大家供大家参考有需要的小伙伴们可以来看看。特点python的作用域是静态的在源代码中变量名被赋值的位置决定了该变量能被访问的范围。即Python变量的作用域由变量所在源代码中的位置决定。Python中并不是所有的语句块中都会产生作用域。只有当变量在Module(模块)、Class(类)、def(函数)中定义的时候才会有作用域的概念。1. 函数内部的变量函数外部不能访问def func():variable 100print(variable)print(variable) # name variable is not defined2. 函数上层的变量(标量)只能读取不能再次定义初始化def counter1():n 0def compute():n n 1 # n为标量(数值字符串浮点数)Python程序会因为“如果内部函数有引用外部函数的同名变量或者全局变量,并且对这个变量有修改.那么python会认为它是一个局部变量,又因为函数中没有n的定义和赋值所以报错# y n 1 # 更改为y就没事# return yreturn nreturn computevariable 300def test_scopt():print(variable) # 此时调用局部变量variable并有没绑定到一个内存对象(没有定义和初始化即没有赋值)。本质上还是遵循的LEGB法则variable 200 #因为这里前面调用过一次所以variable就变为了局部变量# print(variable) # 写在下面就没问题因为variable是新的局部变量而不是重新被定义却没有绑定test_scopt()Python中的模块代码在执行之前并不会经过预编译但是模块内的函数体代码在运行前会经过预编译因此不管变量名的绑定发生在作用域的那个位置都能被编译器知道。Python虽然是一个静态作用域语言但变量名查找是动态发生的直到在程序运行时才会发现作用域方面的问题,3. listdict等复合变量里面的值都可以引用更改def counter():n [0]def compute():n[0] 1 # 更改的是n里面的第一个值不是更改nreturn n[0]return computefunc counter()func() # 1func() # 2func() # 34. global 声明全局变量如果在局部要对全局变量修改需要在局部也要先声明该全局变量def counter1():n 0def compute():global n # 如果在局部要对全局变量修改需要在局部也要先声明该全局变量,但此处也会报错因为没有全局变量nn 1return nreturn compute# rightdef counter1():global nn 0def compute():global nn 1return nreturn compute5. nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量def make_counter():count 0def counter():nonlocal count # 使用外层非全局变量count 1return countreturn counter作用域的类型在Python中使用一个变量时并不严格要求需要预先声明它但是在真正使用它之前它必须被绑定到某个内存对象(被定义、赋值)这种变量名的绑定将在当前作用域中引入新的变量同时屏蔽外层作用域中的同名变量。L(local)局部作用域局部变量包含在def关键字定义的语句块中即在函数中定义的变量。每当函数被调用时都会创建一个新的局部作用域。Python中也有递归即自己调用自己每次调用都会创建一个新的局部命名空间。在函数内部的变量声明除非特别的声明为全局变量否则均默认为局部变量。有些情况需要在函数内部定义全局变量这时可以使用global关键字来声明变量的作用域为全局。局部变量域就像一个栈仅仅是暂时的存在依赖创建该局部作用域的函数是否处于活动的状态。所以一般建议尽量少定义全局变量因为全局变量在模块文件运行的过程中会一直存在占用内存空间。注意如果需要在函数内部对全局变量赋值需要在函数内部通过global语句声明该变量为全局变量。E(enclosing)嵌套作用域E也包含在def关键字中E和L是相对的E相对于更上层的函数而言也是L。与L的区别在于对一个函数而言L是定义在此函数内部的局部作用域而E是定义在此函数的上一层父级函数的局部作用域。主要是为了实现Python的闭包而增加的实现。G(global)全局作用域即在模块层次中定义的变量每一个模块都是一个全局作用域。也就是说在模块文件顶层声明的变量具有全局作用域从外部开来模块的全局变量就是一个模块对象的属性。注意全局作用域的作用范围仅限于单个模块文件内B(built-in)内置作用域系统内固定模块里定义的变量如预定义在builtin 模块内的变量。作用域链变量名解析LEGB法则搜索变量名的优先级局部作用域 嵌套作用域 全局作用域 内置作用域LEGB法则 当在函数中使用未确定的变量名时Python会按照优先级依次搜索4个作用域以此来确定该变量名的意义。首先搜索局部作用域(L)之后是上一层嵌套结构中def或lambda函数的嵌套作用域(E)之后是全局作用域(G)最后是内置作用域(B)。按这个查找原则在第一处找到的地方停止。如果没有找到则会出发NameError错误。example 1name lzldef f1():print(name)def f2():name ericf1()f2() # 在函数未执行之前作用域链就已经形成了此时f1()的上一级应该name lzlexample 2def scope_test():def do_local():spam local spam # 此函数定义了另外的一个spam字符串变量并且生命周期只在此函数内。此处的spam和外层的spam是两个变量如果写出spam spam “local spam” 会报错def do_nonlocal():nonlocal spam # 使用外层的spam变量 test spamspam nonlocal spamdef do_global():global spamspam global spamspam test spamdo_local()print(After local assignmanent:, spam) # test spamdo_nonlocal()print(After nonlocal assignment:,spam) # nonlocal spamdo_global()print(After global assignment:,spam) # nonlocal spam ???? 先找是本地变量找到的本地变量已经在do_nonlocal()里面改变了所以输出的是nonlocal spamscope_test()print(In global scope:,spam) # global spam