目录: https://www.jianshu.com/p/863c446364a8
变量的作用域
在Python程序中创建、改变、查找变量名时,都是在一个保存变量名的空间中进行,我们称之为命名空间,也被称之为作用域。python的作用域是静态的,在源代码中变量名被赋值的位置决定了该变量能被访问的范围。即Python变量的作用域由变量所在源代码中的位置决定。只有当变量在Module(模块)、Class(类)、def(函数)中定义的时候,才会有作用域的概念。
作用域的类型
L(Local) 局部作用域(函数体内)
E (Enclosing)嵌套作用域( 闭包函数外的函数中)
G (Global) 全局作用域(全局范围内)
B (Built-in) 内置作用域(内置函数所在模块的范围)
作用域的优先级:局部作用域 > 嵌套作用域 > 全局作用域 > 内置作用域 即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内置中找。
实例:
import builtins
print(dir(builtins)) # 内置作用域,需要引用builtins模块
li=['1','2','3',"a","b","c"] #嵌套作用域(函数外定义的)
def a(lis):
global li1
li1 = [] #li1 全局变量必须global定义
for i in lis: # i为局部变量
if 48<ord(i)<59:
li1.append(i)
return li1
b=a(li)
print(li1)
print(b)
print(li)
运行结果为:
['1', '2', '3']
['1', '2', '3']
['1', '2', '3', 'a', 'b', 'c']
global和 nonlocal关键字
(nonlocal关键字声明,会在上一层重新定义此变量。)
实例:
def outer():
global num #需要使用 global 关键字声明,直接声明为全局变量。
print(num) #此时输出的num值为初始定义的2
num=123
print(num) #此时的num值为重新赋值后的值
num=2
outer()
print(num) #因为num为全局变量,所以num为改变后的值
运行结果为:
2
123
123
def outer():
num=10
print(num)
def inner():
nonlocal num ##nonlocal关键字声明,会在上一层重新定义此变量。
num=100
print(num)
inner()
print(num)
outer()