全局变量与局部变量,python 定义变量的关系,全局变量与局部变量,python 定义变量不一致
变量定义以后,是有一定的使用范围,称之为变量的作用域。比如Java中,变量的使用范围是变量声明时所在的{}范围,而python的作用域对应的为同一个缩进。按着变量的使用范围给变量划分成如下两种:
1.全局变量:就是在函数外部定义的变量
2.局部变量:就是在函数内部定义的变量
1.全局和局部功能范围 局部变量作用域:只能在被声明的函数内部访问,函数外部使用不了。
这也是不同函数里可以定义名称一样变量的原因
全局变量作用域:可以在整个程序范围内访问,任意函数都可以访问
#1.局部变量,外部不可访问deff1(v1,v2): #)参数也是局部变量(sum=v1 v2 a=5 #)。无法从外部访问该函数-return sum-name error 3360 name“a”未定义========name error 3360 name“a”未定义b=a 1。不会报告任何错误。运算后生成局部变量b .返回a 1 # Use print(F3)1)=================局部变量sum=5deff2 (v2): sum=0而v210: sum=v2 #的用法如下。其中sum使用局部变量的初始值0。global sum=5v 2=1 returnsumprint(sum)print(F2(0))=====结果如下:========================================
当Python遇到变量时,会从010到59000依次进行:局部作用域当前嵌入在局部作用域(封闭局部)global/global中。
2.范围划分LEGB注意:1.PYTHON的作用域由def、class、lambda等语句产生,if、try、for等语句并不会产生新的作用域,换句话说就是if,try,for等语句里面定义的变量并不会随着该语句执行结束而回收,而是可以到处引用的,if,try,for等语句内变量作用域实际范围受其所在 的def,class,lambda范围约束
局部变量:包含在由def关键字定义的语句块或函数定义的变量中。每次调用函数时都会创建一个新的局部作用域。Python也有递归。调用自己,并在每次调用时创建一个新的本地命名空间。除非明确声明为全局变量,否则函数中的变量声明将默认为局部变量。如果需要在函数中定义全局变量,可以使用global关键字来全局声明变量的范围。像堆栈一样,局部变量域是临时的,这取决于创建其局部作用域的函数是否是活动的。所以一般来说,建议尽量少定义全局变量,因为全局变量总是存在于模块文件的运行过程中,并且占用内存空间。
注意:如果需要给函数中的全局变量赋值,必须在函数中使用global语句将变量声明为全局变量。
LEGB法则
关键字def还包括E,其中E和L是相对的,E是L相对于高阶函数。与L不同,对于某些函数,L是定义在这个函数内部的局部作用域,而E是定义在这个函数的父函数之上的局部作用域。主要是实现Python闭包,添加实现。
具体什么是LEGB法则要等后面学完闭包后再讲,这里大致了解一下即可。
也就是说,它是在模块层次结构中定义的变量,每个模块都是一个全局范围。这意味着模块文件顶层声明的变量具有全局作用域,模块的全局变量对外成为模块对象的属性。
注意:全局范围仅限于单个模块文件。
1.L(local)局部作用域
系统中固定模块定义的变量,即系统所具有的可变函数等。例如,在2.E(enclosing)嵌套作用域模块中预定义的变量。
gobal var=100 # gde ftest _ scope(:enclosing var=200 # edeff unc):local var=300 # lprint)_ _ name _ _())
Val=10 def f1(v1):val=5 return val print)val)#结果为10,局部变量val范围为print(f1 )1) #因为5)在函数中声明为全局变量val=10 deff 1)v1):global val=30 return val print),结果为10。但是更新val的值======================
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。