1. 命名空间和作用域 命名空间 1. 内置命名空间: python解释内部运行时的变量函数 2. 全局命名空间: 我们在py文件中直接声明出来的变量, 函数 3. 局部命名空间: 在函数内部声明的变量和函数 作用域: 1. 全局作用域: 内置 + 全局 2. 局部作用域: 局部 globals() 查看全局作用域中的名字 locals() 查看当前作用域中的名字 2. global和nonlocal global: 把全局变量拿到局部来用. nonlocal:把离他最近的一层的变量拿过来, 不会找全局 3. 闭包 内部函数访问外部函数的局部变量 好处: 1. 安全 2. 常驻内存, 提高效率
1. globals()和locals()
a = 100 # 全局变量 def main(): # 全局变量 a = 50 # 按就近原则, 局部变量 print(a) # 局部变量 print(‘哎!最近天气有点热!‘) # 局部变量 print(globals()) # globals() 获取到全局作用域(内置,全局)中的所有名字 print(locals()) # locals() 查看当前作用域中的所有名字 main()
2. global和nonlocal
a = 90 def func(): global a # 把外面全局中的a引入, a 不在是局部变量,是全局变量 a = 30 # 修改赋值, 把全局重新赋值(变成了30) print(a) func() print(a) a = 10 # 又重新赋值 print(a) # 输出: # 30 # 30 # 10 a = 10 def func1(): a = 40 def func2(): # nonlocal a 只要是在局部中就可以引进来 nonlocal a # 找局部作用域中, 离他最近的那个变量引入进来 a = 20 # 把上面的a = 40 进行赋值,所以上面的a = 20 print(a) # 20 func2() print(a) # 20 func1() # 输出: # 20 # 20
3. 闭包
def func(): name = ‘小明‘ # 常驻内存 防止其他程序改变这个变量 def inner(): print(name) # 在内存函数中调用外层函数的变量,叫闭包,可以让一个局部变量常驻内存 return inner ret = func() ret() # 执行的是inner() # 闭包的好处 def func(): content = [‘小王‘,‘小张‘,‘小明‘] def inner(): # print("你好啊") # 没有使用外部变量, 不是闭包 print(content) # 使用了外部变量, 是闭包 return content # 在函数内部使用了外部变量, 闭包 print(inner.__closure__) # 查看inner是否是闭包, 如果有东西就是闭包,没东西就不是闭包 return inner fn = func() ret = fn() print(ret)
原文地址:https://www.cnblogs.com/Pengdachui-1/p/11143024.html
时间: 2024-10-09 10:01:03