Python:变量作用域 什么是全局变量、局部变量

变量作用域

变量由作用范围来限制,按照作用域分类可分为:
- 全局(global): 在函数外部定义
- 局部(local):在函数内部定义

变量的作用范围:
  • 全局变量:在整个全局范围都有效
  • 全局变量在局部可以使用(即函数内部可以方位函数外部定义的变量)
  • 局部变量在局部范围可以使用
  • 局部变量在全局范围无法使用,在局部范围内(比如函数)将局部变量用global函数定义为全局函数,并且调用了此函数后,在全局范围内能调用此局部变量。
    LEGB原则
    L(Local)局部作用域
    E(Enclosing function locale)外部嵌套函数作用域
    G(Global module)函数定义所在模块作用域
    B(Buildin): python内置魔抗的作用域

global函数

使用global函数可以将局部范围内(比如函数)的局部变量提升为全局变量。

def fun():
    global a2
    global a3#将a2、a3定义为全局变量
    a2=20
    print(a2)
    a3 =99
    print(a3)
#print(a2)调用函数前,调用内部变量a2会报错
fun()#只有在调用此函数后,内部的局部变量才能被调用
print(a2)
print(a3)

20
99
20
99

再举一个例子

b2 = 22#全局变量
def fun():
    b2 = 99#局部变量
    print(b2)
print(b2)
fun()#函数调用全局变量,输出b2=99
print(b2)#函数内部没定义b2为全局变量,所以依然输出为22

22
99
22

globals, locals函数

可以通过globals和locals显示出局部变量和全局变量,可以从我之前编的汉诺塔程序体会到Locals函数的好处,可以帮助理解递归中,各个变量的赋值变化。

locas函数:

函数功能为,返回当前作用域内的局部变量和其值组成的字典,与globals函数类似(返回全局变量),可用于函数内。函数所返回的字典集合不能修改,不知道能不能将其转换为列表进行更改,下次试试。

def hanoi(n,a,b,c):
    if n==1:
        print(a,'-->',c)
    else:
        print(locals())
        hanoi(n-1,a,c,b)#
        print(locals())
        hanoi(1,a,b,c)
        print(locals())
        hanoi(n-1,b,a,c)
        print(locals()) 
hanoi(3,'A','B','C')

{'c': 'C', 'b': 'B', 'a': 'A', 'n': 3}
{'c': 'B', 'b': 'C', 'a': 'A', 'n': 2}
A --> C
{'c': 'B', 'b': 'C', 'a': 'A', 'n': 2}
A --> B
{'c': 'B', 'b': 'C', 'a': 'A', 'n': 2}
C --> B
{'c': 'B', 'b': 'C', 'a': 'A', 'n': 2}
{'c': 'C', 'b': 'B', 'a': 'A', 'n': 3}
A --> C
{'c': 'C', 'b': 'B', 'a': 'A', 'n': 3}
{'c': 'C', 'b': 'A', 'a': 'B', 'n': 2}
B --> A
{'c': 'C', 'b': 'A', 'a': 'B', 'n': 2}
B --> C
{'c': 'C', 'b': 'A', 'a': 'B', 'n': 2}
A --> C
{'c': 'C', 'b': 'A', 'a': 'B', 'n': 2}
{'c': 'C', 'b': 'B', 'a': 'A', 'n': 3}

猜你喜欢

转载自blog.csdn.net/qq_28766729/article/details/82556516