python变量的作用域:局部变量和全局变量

缺乏、安全感 2022-05-17 11:26 369阅读 0赞

变量定义以后,是有一定的使用范围,称之为变量的作用域。比如Java中,变量的使用范围是变量声明时所在的{}范围,而python的作用域对应的为同一个缩进。按着变量的使用范围给变量划分成如下两种:

1.全局变量:就是在函数外部定义的变量

2.局部变量:就是在函数内部定义的变量

1.全局函数和局部函数的作用域

局部变量作用域:只能在被声明的函数内部访问,函数外部使用不了。

这也是不同函数里可以定义名称一样变量的原因

全局变量作用域:可以在整个程序范围内访问,任意函数都可以访问

  1. #1.局部变量,外部访问不了
  2. def f1 (v1,v2): #参数也属于局部变量
  3. sum = v1+v2
  4. a = 5 #局部变量,函数外部访问不了
  5. return sum
  6. --------------------------------
  7. print(a) #报错,NameError: name 'a' is not defined
  8. =====================================================================
  9. #2.全部变量,函数里外都可以访问
  10. a =3
  11. def f3(v2):
  12. # a = a+1 注意:报错,因为局部作用域内只能引用全局域变量的值,而不能修改全局作用域的值。
  13. # b = a+1 则不会报错,引用全局变量的值,运算后给赋给局部变量b.
  14. return a+1 #外部的全局变量函数内部使用
  15. print(f3(1))
  16. =============结果如下======================
  17. 4
  18. ===================================-===================================
  19. #3.如果全局变量的名字和局部变量的名字相同,那么使用的是局部变量的
  20. sum =5
  21. def f2(v2):
  22. sum =0
  23. while v2 < 10:
  24. sum += v2 #这里sum使用的是局部变量的初始值0,而不是全局sum=5
  25. v2 += 1
  26. return sum
  27. print(sum)
  28. print(f2(0))
  29. ===========结果如下=========================
  30. 5
  31. 45
  32. ===========================================

注意:1. PYTHON的作用域由def、class、lambda等语句产生,if、try、for等语句并不会产生新的作用域,换句话说就是if,try,for等语句里面定义的变量并不会随着该语句执行结束而回收,而是可以到处引用的,if,try,for等语句内变量作用域实际范围受其所在 的def,class,lambda范围约束

  1. 2. Python 遇到一个变量的话他会按照这样的顺序进行搜索**LEGB法则**:本地作用域(Local)→当前作用域被嵌入的本地作用域(Enclosing locals)→全局/模块作用域(Global)→内置作用域(Built-in).**具体什么是LEGB法则要等后面学完闭包后再讲,这里大致了解一下即可。**

2.作用域的划分LEGB

1. L(local)局部作用域

  1. 局部变量:包含在def关键字定义的语句块中,即在函数中定义的变量。每当函数被调用时都会创建一个新的局部作用域。Python中也有递归,即自己调用自己,每次调用都会创建一个新的局部命名空间。在函数内部的变量声明,除非特别的声明为全局变量,否则均默认为局部变量。有些情况需要在函数内部定义全局变量,这时可以使用global关键字来声明变量的作用域为全局。局部变量域就像一个 栈,仅仅是暂时的存在,依赖创建该局部作用域的函数是否处于活动的状态。所以,一般建议尽量少定义全局变量,因为全局变量在模块文件运行的过程中会一直存在,占用内存空间。

注意:如果需要在函数内部对全局变量赋值,需要在函数内部通过global语句声明该变量为全局变量。

2.E(enclosing)嵌套作用域

  1. E也包含在def关键字中,EL是相对的,E相对于更上层的函数而言也是L。与L的区别在于,对一个函数而言,L是定义在此函数内部的局部作用域,而E是定义在此函数的上一层父级函数的局部作用域。主要是为了实现Python的闭包,而增加的实现。

3.G(global)全局作用域

  1. 即在模块层次中定义的变量,每一个模块都是一个全局作用域。也就是说,在模块文件顶层声明的变量具有全局作用域,从外部开来,模块的全局变量就是一个模块对象的属性。

注意:全局作用域的作用范围仅限于单个模块文件内

4.B(built-in)内置作用域

  1. 系统内固定模块里定义的变量,即系统自带的的变量函数之类的。如预定义在**builtin** 模块内的变量。
  2. globa lVar = 100 #G
  3. def test_scope():
  4. enclosingVar = 200 #E
  5. def func():
  6. localVar = 300 #L
  7. print (__name__) #B

2.局部变量声明为全局变量global

  1. val =10
  2. def f1(v1):
  3. val =5
  4. return val
  5. print(val ) #结果是10,因为局部变量val作用域只是函数内
  6. print(f1(1)) #5
  7. #使用global将局部变量声明为全局变量
  8. val =10
  9. def f1(v1):
  10. global val
  11. val = 30
  12. return val
  13. print(val ) #结果是10.虽然声明了global,但是函数要调用才会执行,才会更新val的值
  14. ============================================================================
  15. val =10
  16. def f1(v1):
  17. global val
  18. val = 30
  19. return val
  20. f1(2)
  21. print(val ) #结果是30.调用函数f1后,将val的值给刷新了。

统一声明:关于原创博客内容,可能会有部分内容参考自互联网,如有原创链接会声明引用;如找不到原创链接,在此声明如有侵权请联系删除哈。关于转载博客,如有原创链接会声明;如找不到原创链接,在此声明如有侵权请联系删除哈。

发表评论

表情:
评论列表 (有 0 条评论,369人围观)

还没有评论,来说两句吧...

相关阅读