变量定义以后,是有一定的使用范围,称之为变量的作用域。比如Java中,变量的使用范围是变量声明时所在的{}范围,而python的作用域对应的为同一个缩进。按着变量的使用范围给变量划分成如下两种:
1.全局变量:就是在函数外部定义的变量
2.局部变量:就是在函数内部定义的变量
局部变量作用域:只能在被声明的函数内部访问,函数外部使用不了。
这也是不同函数里可以定义名称一样变量的原因
全局变量作用域:可以在整个程序范围内访问,任意函数都可以访问
#1.局部变量,外部访问不了
def f1 (v1,v2): #参数也属于局部变量
sum = v1+v2
a = 5 #局部变量,函数外部访问不了
return sum
--------------------------------
print(a) #报错,NameError: name 'a' is not defined
=====================================================================
#2.全部变量,函数里外都可以访问
a =3
def f3(v2):
# a = a+1 注意:报错,因为局部作用域内只能引用全局域变量的值,而不能修改全局作用域的值。
# b = a+1 则不会报错,引用全局变量的值,运算后给赋给局部变量b.
return a+1 #外部的全局变量函数内部使用
print(f3(1))
=============结果如下======================
4
===================================-===================================
#3.如果全局变量的名字和局部变量的名字相同,那么使用的是局部变量的
sum =5
def f2(v2):
sum =0
while v2 < 10:
sum += v2 #这里sum使用的是局部变量的初始值0,而不是全局sum=5
v2 += 1
return sum
print(sum)
print(f2(0))
===========结果如下=========================
5
45
===========================================
注意:1. PYTHON的作用域由def、class、lambda等语句产生,if、try、for等语句并不会产生新的作用域,换句话说就是if,try,for等语句里面定义的变量并不会随着该语句执行结束而回收,而是可以到处引用的,if,try,for等语句内变量作用域实际范围受其所在 的def,class,lambda范围约束。
2.当 Python 遇到一个变量的话他会按照这样的顺序进行搜索LEGB法则:本地作用域(Local)→当前作用域被嵌入的本地作用域(Enclosing locals)→全局/模块作用域(Global)→内置作用域(Built-in).具体什么是LEGB法则要等后面学完闭包后再讲,这里大致了解一下即可。
1. L(local)局部作用域
局部变量:包含在def关键字定义的语句块中,即在函数中定义的变量。每当函数被调用时都会创建一个新的局部作用域。Python中也有递归,即自己调用自己,每次调用都会创建一个新的局部命名空间。在函数内部的变量声明,除非特别的声明为全局变量,否则均默认为局部变量。有些情况需要在函数内部定义全局变量,这时可以使用global关键字来声明变量的作用域为全局。局部变量域就像一个 栈,仅仅是暂时的存在,依赖创建该局部作用域的函数是否处于活动的状态。所以,一般建议尽量少定义全局变量,因为全局变量在模块文件运行的过程中会一直存在,占用内存空间。
注意:如果需要在函数内部对全局变量赋值,需要在函数内部通过global语句声明该变量为全局变量。
2.E(enclosing)嵌套作用域
E也包含在def关键字中,E和L是相对的,E相对于更上层的函数而言也是L。与L的区别在于,对一个函数而言,L是定义在此函数内部的局部作用域,而E是定义在此函数的上一层父级函数的局部作用域。主要是为了实现Python的闭包,而增加的实现。
3.G(global)全局作用域
即在模块层次中定义的变量,每一个模块都是一个全局作用域。也就是说,在模块文件顶层声明的变量具有全局作用域,从外部开来,模块的全局变量就是一个模块对象的属性。
注意:全局作用域的作用范围仅限于单个模块文件内
4.B(built-in)内置作用域
系统内固定模块里定义的变量,即系统自带的的变量函数之类的。如预定义在builtin 模块内的变量。
globa lVar = 100 #G
def test_scope():
enclosingVar = 200 #E
def func():
localVar = 300 #L
print (__name__) #B
2.局部变量声明为全局变量global
val =10
def f1(v1):
val =5
return val
print(val ) #结果是10,因为局部变量val作用域只是函数内
print(f1(1)) #5
#使用global将局部变量声明为全局变量
val =10
def f1(v1):
global val
val = 30
return val
print(val ) #结果是10.虽然声明了global,但是函数要调用才会执行,才会更新val的值
============================================================================
val =10
def f1(v1):
global val
val = 30
return val
f1(2)
print(val ) #结果是30.调用函数f1后,将val的值给刷新了。
统一声明:关于原创博客内容,可能会有部分内容参考自互联网,如有原创链接会声明引用;如找不到原创链接,在此声明如有侵权请联系删除哈。关于转载博客,如有原创链接会声明;如找不到原创链接,在此声明如有侵权请联系删除哈。