``一、作用域(scope)
1、作用域指的是变量生效的区域
def fn():
a = 10 # a定义在了函数内部,所以它的作用域就是函数的内部,函数外部无法访问
print ('函数内部:','a =',a)
fn()
print('函数外部:','a =',a)
2、在python中一个有两种作用域
(1)全局作用域
- 全局作用域在程序执行时创建,在程序执行结束时销毁
- 所有函数以外的区域都是全局作用域
- 在全局作用域中定义的变量,都属于全局变量,全局变量可以在程序的任意位置被访问
(2)函数作用域
- 函数作用域在函数调用时创建,在调用结束时销毁
- 函数每调用一次就会产生一个新的函数作用域
- 在函数作用域中定义的变量,都是局部变量,它只能在函数内部呗访问
3、变量的查找
当我们使用变量时,会优先在当前作用域中寻找该变量,如果有则使用,如果没有则继续去上一级作用域中寻找。
def fn() :
a = 30
def fn2() :
print ('fn2中:','a =',a)
fn2()
fn
4、
def fn() :
# a = 10 # 在函数中为变量赋值时,默认都是为局部变量赋值
# 如果希望在函数内部修改全局变量,则需要使用global关键字,来声明变量
global a # 声明在函数内部的使用a是全局变量,此时再去修改a时,就时在修改全局的a
a = 10 # 修改全局变量
print ('函数内部: ','a =',a)
fn()
print('函数外部:','a=',a)
二、命名空间(namespace)
1、命名空间指的是变量存储的位置,每一个变量都需要存储到指定的命名空间当中
2、每一个作用域都会有一个它对应的命名空间
3、全局命名空间,用来保存全局变量。函数命名空间用来保存函数中的变量
4、命名空间实际上就是一个字典,是一个专门用来存储变量的字典
5、locals()函数
(1) 用来获取当前作用域的命名空间
(2)如果在全局作用域中调用locals()则获取全局命名空间,如果在函数作用域中则获取函数命名空间,返回的是一个字典
def fn:
scope = locals() # 在函数内部调用locals()会获取到函数的命名空间
scope['b'] = 20 # 可以通过scope来操作函数的命名空间,但是不建议这么做
print(scope)
fn()
6、globals()函数
(1)可以用来在任意位置获取全局命名空间