在学习完函数编程后,发现又有一个很小但是很重要的问题,那就是python变量的作用域,本文整理了python中变量的作用(全局变量和局部变量)
作用域
既然要谈到局部变量和全局变量,那么就不可避免的需要说一下python中的作用域划分python中主要有4个作用域分别为
Local function:局部作用域(函数内部)
enclosing function locals:外部嵌套函数作用域
Globals module:函数定义模块(文件)作用域
Builtin:python内置模块作用域
这四个作用域合成LEGB四大金刚
让我们画图来感受一下这四个作用域的关系:
那么在访问变量的顺序如下:
Locals function -->enclosing function locals --> Globals module -->Builtin
让我们举一个栗子
v = 100
def fun1():
v= 200
print("fun1.v = ",v)
def fun2():
v=300
print('fun2.v=',v)
fun2()
fun1()
print("全局的v = ",v)
函数嵌套
在一个函数内嵌套定义另一个函数
def fun_outer():
print("fun_outer has been called")
#在此处创建另一个函数,并在下面调用
def fun_inner():
print("fun_inner has been called")
fun_inner() #the first called
fun_inner() #the second called
print("fun_outer has been called")
fun_outer()
f = fun_outer()
局部变量
一般定义在函数内部的变量称为局部变量,函数调用时被创建,函数调用结束后如果不返回的话,局部变量就会被销毁
def fx(c):
print("hello")
d = 400 #局部变量2:d
a = 10
print("world")
print(a,b,c,d,sep=" =>")
fx(300)
print(c) #error,函数调用结束c已经被销毁
print(d) #error,函数调用结束d已经被销毁
注意:因为python中没有指针传只的概念,那么如果不是用return来返回变量,那么变量永远就只能在函数内部使用。
全局变量
广泛的来讲就是定义在函数之外的,再python中模块内部的变量称为全局变量,对于同一模块的所有函数都可以在自己的函数体内访问全局变量,但是却不能根据赋值语句来改变全局变量的值。
a = 200
b = 100
def fx(c): #局部变量1:c
print("hello")
d = 400 #局部变量2:d
a = 10 #此语句只能创建临时局部变量a不能改变全局变量a
print("world")
print(a,b,c,d,sep=" =>") #100,200,300,400
print(a) #200在函数外查看a的值依旧是200
在看完全局变量&局部变量&作用域的基本定义和使用规则之后我们就会发现,python中对于全局变量和局部变量重名的情况下完全不会有覆盖情况,也就是在函数内部并不能直接修改全局变量,显然这是不合理的,那么下来就开始解决这个问题:
global
使用global生命一个或者多个变量的作用域是模块级的(即全局)
v= 200
def fn():
global v #声明v为全局变量
v = 200
fn()
print("v= ",v)
nonlocal
声明一个变量的作用域是enclosing function locals
var = 100
def f1():
var = 200
print("f1里的var =",var)
def f2():
nonlocal var #声明var为f2以外,全局变量以内
var = 300
f2()
print("f1调用结束var =",var)
f1()
print("全局的var =",var)