Python--全局变量、局部变量、作用域

全局变量、局部变量、作用域

作用域

      作用域简单说就是一个变量的命名空间。代码中变量被赋值的位置,就决定了哪些范围的对象可以访问这个变量,这个范围就是命名空间。python赋值时生成了变量名,当然作用域也包括在内。
      一个全局变量的命名空间是这个模板,一个局部变量的命名空间是一个局部。

LEGB规则

locals->enclosing function -> globals -> builtins

locals:表示在在当前本地的命名空间中进行查找,
enclosing:表示当前函数的外部函数的本地命名空间
globals:表示全局变量
builtions:表示系统自动加载的变量

查找变量,首先在locals中进行查找,然后enclosing,再然后globals,接着最后在builtins中进行查找,如果在某一级中先找到,则停止向下查找,如果都没找到,则报错。(提示:函数名也是变量)

全局变量

      定义在模板的最外层或者if name == "main"的变量,被称之为全局变量。
全局变量不仅可以在函数体外部被访问到,而且函数体内部也可以查找的到。

#!encoding=utf-8
a = [1, 2]
def test():

    a.append(456)
    print(a)
    test1()

def test1():
    print("test1")


if __name__ == '__main__':

    print(a)
    test()
    print(a)

输出为:

[1, 2]
[1, 2, 456]
test1
[1, 2, 456]

使用global关键字修饰的变量,表示在LEGB规则的global等级开始查找该变量,如果没找到,则报错,也就是说,使用global修饰的变量,必须在再全局中及其以下的等级中定义定义。global关键字可以用在任何地方,包括最上层函数中和嵌套函数中,即使之前未定义该变量,global修饰后也可以直接使用。

#!encoding=utf-8
a = [1, 2]
def test():
    global print   #builtin 等级的变量
    global a       #global 等级的变量
    a.append(456)
    print(a)
    test1()

def test1():
    print("test1")


if __name__ == '__main__':

    print(a)
    test()
    print(a)

输出结果为:

[1, 2]
[1, 2, 456]
test1
[1, 2, 456]

使用globals([Namespace])函数,可以查看所有指定命名空间内的全部全局变量。不指定参数,则默认为当前的模板。
在这里插入图片描述

局部变量

      没有定义为全局变量的变量与没有使用global声明的变量统称为局部变量。局部变量的作用域是函数体的内部,在外部不可用。
如:

#!encoding=utf-8
a = [1, 2]
def test():
    b= [1,2]
    b.append(456)
    print(a)
    test1()
    print(globals())
    print(locals())



if __name__ == '__main__':

    print(b)
    test()

输出结果为:
在这里插入图片描述
使用locals([Namespace])函数,可以查看所有指定命名空间内的全部局部变量。不指定参数,则默认为当前的命名空间。

#!encoding=utf-8
a = [1, 2]
def test():
    b= [1,2]
    b.append(456)
    print(locals())



if __name__ == '__main__':

    test()

输出结果为:

{'b': [1, 2, 456]}

nonlocal 可以用来修饰变量,nonlocal关键字修饰变量后标识该变量是上一级函数中的局部变量,如果上一级函数中不存在该局部变量,nonlocal位置会发生错误(最上层的函数使用nonlocal修饰变量必定会报错)。nonlocal关键字只能用于嵌套函数中,而且只有python3中有,并且外层函数中定义了相应的局部变量,否则会发生错误(见第一)。

#!encoding=utf-8
a = 3
def test():
    b = 100
    def test1():
        nonlocal b   #省去这一行则报错
        b = b + 1
        print(b)
    return test1



if __name__ == '__main__':

    ret = test()
    ret()

输出结果为:

101

重点来了:
      使用非当前作用域的变量的而且未使用global或者nonlocal时候,当变量是不可变类型的时候,使用的时候不可以修改引用的变量的值。(如:整形,字符串),可变类型的数据,(如:列表、字典、集合、类),在引用的时候可以修改引用的变量的值。

#!encoding=utf-8
a = [1,2]
b =3
c= 4
def test():
    a.append(3)
    print(a)
    global b
    b=b+1
    print(b)
    c=c+1



if __name__ == '__main__':

    test()

输出结果为:
在这里插入图片描述

#!encoding=utf-8

def test():
    a = [1, 2]
    b = 3
    c=4
    def test1():
        a.append(3)
        print(a)
        nonlocal b
        b = b + 1
        print(b)
        c = c+1
    return test1



if __name__ == '__main__':

    ret = test()
    ret()

输出结果为:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43442071/article/details/88975715