Python 变量作用域

一、Python 中变量作用域分为以下四种,简称 LEGB:

  • Local 局部变量
  • Enclosed 嵌套变量
  • Global 全局变量
  • Built-in 内置变量
    • Local 局部变量:暂时的存在,依赖于创建该局部作用域的函数。函数存,则局部变量存,函数亡,则局部变量亡
#局部作用域
def fun():
    b = 2
    print(b)    #输出2
    
fun()
print(b)    #报错
    • Enclosed(嵌套):一般是在函数中嵌套函数的时候,外层函数的变量作用域
#Enclosed(嵌套)作用域
def fun1():
    b = 2
    print("这是fun1打印的:", b)
    def fun2():
        print("这是fun2打印的:", b)    # 在这里函数fun2里面并没有定义变量b,但是它能够引用外层函数fun1定义的b变量,此时变量b的作用域就是Enclosed
    return fun2

temp = fun1()    #调用fun1
temp()    #调用fun2

# 结果如下
这是fun1打印的: 2
这是fun2打印的: 2
    • Global(全局):一般模块文件顶层声明的变量具有全局作用域,从外部来看,模块的全局变量就是一个模块对象的属性,仅限于单个模块文件中
#Global(全局)作用域
a = 2    # a 就是一个全局变量
def fun1():
    print("这是fun1打印的:", a)

fun1()
print(a)
    • Built-in(内置):解释器内置的变量,比如int, str等

 

二、变量的使用规则

  • 创建变量时从上往下创建,搜索变量时从下往上搜索。
  • 创建变量时,下层变量会覆盖上层同名变量,但不会改变上层变量的值,除非使用gloable和nonlocal关键字声明

 

 三、变量的修改

  • global 修改全局变量
    • 一般全局变量一经定义后几乎是不用改的,也不允许在局部修改全局变量,除非使用 Global 关键字声明。如下  
a = "我是全局变量"
def fun1():
    global a    #使用global声明
    a += ",但是是修改后的全局变量"#修改全局变量
    print(a)

print(a)#fun1函数修改前
fun1()
print(a)#fun1函数修改后

# 结果如下
我是全局变量
我是全局变量,但是是修改后的全局变量
我是全局变量,但是是修改后的全局变量
  • nonlocal修改外层函数变量
    • 在函数中嵌套函数时,嵌套在里面的函数创建的作用域内一般也是不允许改变外层函数变量的值的,除非是 nonlocal 关键字声明。如下  
#使用nonocal声明,修改外层函数变量值
def fun1():
    a = "我是fun1的变量"
    print(a)#修改前
    def fun2():
        nonlocal a  #使用nonlocal声明
        a += ",但是我是修改后的"
        print(a)#修改后
    return fun2

temp = fun1()#调用fun1
temp()#调用fun2

# 结果如下
我是fun1的变量
我是fun1的变量,但是我是修改后的

 

posted @ 2022-11-01 14:04  Evan0813  阅读(219)  评论(0)    收藏  举报