作用域
-
从空间角度研究函数
全局名称空间: py文件运行时开辟的,存放的是执行的py文件(除去函数内部)的所有的变量与值(地址)的对应关系,整个py文件结束之后,才会消失。
临时(局部)名称空间: 函数执行时,在内存中临时开辟的一个空间,存放的函数中的变量与值的对应关系,随着函数的结束而消失。
内置名称空间:input,print,内置函数等。
-
取值顺序加载顺序
加载顺序:上面这三个空间,谁先加载到内存。
内置名称空间 ----》 全局名称空间 ----》 (函数执行时)临时名称空间
取值顺序:(就近原则)
-
作用域
全局作用域:全局名称空间,内置名称空间。
局部作用域:局部名称空间。
关键字:global,nonlocal
# count = 0
#
# def func():
# count += 1
# func()
#报错
# UnboundLocalError: local variable 'count' referenced before assignment
# 解释器认为:如果你在局部作用域对一个变量进行修改了,
# 你在局部作用域已经定义好这个变量了。
global
-
可以在局部作用域声明一个全局变量。
# 这是剪切 # def func(): # 在全局定义一个变量name # global name # name = 1 # # print(globals()) # # print(locals()) # name += 1 # print(globals()) # # # func() # # print(name) # print(globals())
-
可以修改全局变量。
# count = 0 # # def func(): # global count # count += 1 # # print(count) # func() # print(count)
nonlocal
- 不能操作全局变量。
- 可以对父级作用域的变量进行修改,并且在当前作用域创建(复制)一份此变量。
# 这是复制
# def func():
# count = 0
# def inner():
# nonlocal count
# count += 1
# print(count)
# print(locals())
# inner()
# print(locals())
# func()
# UnboundLocalError: local variable 'count' referenced before assignment
# 解释器认为:如果你在局部作用域对一个变量进行修改了,
# 你在局部作用域已经定义好这个变量了。