python变量的作用域

(这里的解释不涉及类,因为类中的变量我们称为类的属性)

Python遵循LEGB原则:

以 L –> E –> G –>B 的规则查找

L(local)     函数内部:局部作用域 
E(Enclosing) 闭包函数外的函数中 
G(Global)    函数外:全局作用域 
B(Built-in)  内建作用域(暂时还搞不清楚和全局作用域的区别)

eg:

g_var = 1000                   #全局作用域变量
def fun():
    e_var = 100                #enclosing作用域变量
    def fun_in():
         l_var = 10             #局部作用域变量

全局变量在其它作用域中的使用

操作要求如下:

1.不修改全局变量的内存地址:(一旦修改就变成了该作用域下的变量,改变了该变量的作用域)

    #数据不可变类型
    eg:g_var_int = 123
    这种不可变类型的数据只要修改就会改变其内存地址,所以在其它作用域不能修改只能被引用

    #数据可变类型
    eg:g_var_list = [1,2,3]
        #在其它作用域:
            g_var_list.append(2)  #可行,没有改变其内存地址
            g_var_list = []       #不可行,改变了内存地址

  2.修改全局变量的内存地址,使其仍然为全局变量
      只要在修改之前添加一个global声明即可

    eg:g_var_list = [1,2,3]

        #在其它作用域:
            global g_var_list
            g_var_list = []       #改变了内存地址,但依然是一个全局变量

     #实际上就是在局部作用域用global声明了一个全局变量,从内存地址变化来看,此g_var_list已非彼g_var_list.

Enclosing作用域的变量在局部作用域中的操作和全局变量在其它作用域中是一样的,只是global关键字要修改成nonlocal

你可能感兴趣的:(python学习笔记)