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

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

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

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

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

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

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

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

#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)

2.作用域的划分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的值给刷新了。

猜你喜欢

转载自blog.csdn.net/qq_26442553/article/details/81566571