(这里的解释不涉及类,因为类中的变量我们称为类的属性)
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.