Python中的变量作用域

时间:2021-01-16 15:43:18

python中变量作用域包括:

L (Local) 局部作用域,函数内部声明但没有使用global的变量
E (Enclosing) 闭包函数外的函数中,def或者lambda的本地作用域
G (Global) 全局作用域,函数中使用global声明的变量或在模块层声明的变量
B (Built-in) 内建作用域,python的内置类和函数等

当在函数中使用未认证的变量名时,将依照L->E->G->B的顺序搜索。

Python除了def/class/lambda 外,其他如: if/elif/else/  try/except  for/while并不能改变其作用域。定义在他们之内的变量,外部还是可以访问。

1.变量在函数内部第一次出现,且在=左边,则为局部变量,作用在函数内部。

 num = 100
def func():
num = 200 #局部变量
print(num) func() #输出200
print(num) #输出100
 num = 100
def func():
num = num + 200 #报错UnboundLocalError: local variable 'num' referenced before assignment,说明num是局部变量,在赋值前就被引用了
print(num) func()

2.变量在函数内部第一次出现是在=右边,或作为函数参数,且之前已经定义了全局变量,那这里就是对全局变量的引用。

 num = 100
def func():
new = num + 200
print(new) func() #输出300
print(num) #输出100
 num = 100
def func():
print(num) func() #输出100

3.如果需要在函数内部引用并修改全局变量,则需使用global关键字。

 num = 100
def func():
global num
num = 'abc'
print(num) func() #输出abc
print(num) #输出abc

4.nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量

 #利用闭包返回一个计数器函数,每次调用它返回递增整数
def createCounter():
i = 0
def counter():
nonlocal i
i += 1
return i
return counter # 测试:
counterA = createCounter() #返回counter()代码块及变量i=1
print(counterA(), counterA(), counterA(), counterA(), counterA()) # 1 2 3 4 5 每次执行counterA()时,就是执行counter()代码块,改变i的值
counterB = createCounter() #返回counter()代码块及变量i=1
if [counterB(), counterB(), counterB(), counterB()] == [1, 2, 3, 4]:
print('测试通过!')
else:
print('测试失败!')