Python之函数作用域与闭包
2019-02-23 15:15
204 查看
''' 命名空间:存放名称与值对应关系的空间 命名空间分类: 内置命名空间: python解释器启动时开辟的命名空间 存储着内置函数等内容的引用值 全局命名空间: python文件中非函数内部的代码所在的命名空间 局部命名空间: 函数内部代码所在的命名空间 加载顺序:内置命名空间>全局命名空间(从上到下)>局部命名空间(从上到下) 由于加载顺序从上到下,所以遵循先定义,再使用 取值顺序:局部命名空间>全局命名空间>内置命名空间 取值遵循就近原则 ----------------------------------------------------------------------- 作用域分类: 全局作用域: 在全局有效,局部同样可以调用(如例1) 局部作用域: 只在局部有效,全局不可调用(如例2) print() input() len() max() list() str() int() tuple() dict() ... 均属于内置命名空间 a = 1 # 全局命名空间中的变量 def func(): a = 2 # 局部命名空间中的变量 print(a) func() ''' # 例1: # a = 2 # def func(): # print(a) # func() # ------可以输出a的值:局部命名空间可以读取全局命名空间的值------------------- # 例2 # def func(): # a = 2 # print('in func:',a) # print(a) # ------报错,全局不可访问局部变量------------------------------------------ # a = 2 # def func(): # a -= 1 # print('函数内:',a) # func() # print('全局:',a) # ------报错:a的值不可改变:局部命名空间不可以修改全局命名空间的值------------ # lst = [1,2,3,4] # def func(): # lst[0] = 0 # print(lst) # # func() # print(lst) # ------输出[0, 2, 3, 4],对于可变数据类型,局部命名空间中可以修改全局命名空间中数据类型的元素 # lst = [1,2,3,4] # def func(): # lst.append(5) # print(lst) # # func() # print(lst) # ------输出[1, 2, 3, 4, 5],可变数据类型可以增加元素 # lst = [1,2,3,4] # def func(): # del lst[1] # # del lst # 报错 # print(lst) # # func() # print(lst) # ------局部命名空间中可以对全局命名空间中可变数据类型中元素增删查改,但不可改变数据结构本身 # a = 1 # def f1(): # def f2(): # print("in f2:",a) # print("in f1:",a) # print(f2.__closure__) # return f2 # func = f1() # func() # f2.__closure__为None # def f1(): # a = 1 # def f2(): # a = 2 # print("in f2:",a) # print("in f1:",a) # print(f2.__closure__) # return f2 # func = f1() # func() # f2.__closure__ 为None # def f1(): # a = 1 # def f2(): # print("in f2:",a) # print(f2.__closure__) # return f2 # func = f1() # func() # f2.__closure__为(<cell at 0x000001714F5E74C8: int object at 0x0000000076D86C10>,) # def f1(): # a = 1 # def f2(): # def f3(): # print("in f3:",a) # print(f3.__closure__) # return f3 # value = f2() # return value # func = f1() # func() # f2.__closure__为(<cell at 0x000002D1885674C8: int object at 0x0000000076D86C10>,) # --------闭包:内部函数引用了外部作用域非全局作用域名字的引用,此内部函数称为闭包
相关文章推荐
- python[变量作用域-函数-闭包-装饰器-生成器]
- 王亟亟的Python学习之路(10)-函数对象的作用域,函数作为返回值,闭包
- python函数名称空间与作用域、闭包
- python函数作用域与闭包
- Python函数作用域和闭包
- python入门到秃顶(7):函数作用域和匿名函数,闭包递归回调
- 洗礼灵魂,修炼python(22)--自定义函数(3)—函数作用域,闭包
- Python学习笔记七:内置函数补充,函数作用域,闭包及递归
- python基础----函数的定义和调用、return语句、变量作用域、传参、函数嵌套、函数对象、闭包、递归函数
- Python函数的作用域、闭包、装饰器
- Python学习(21):Python函数(5):变量作用域与闭包
- Python函数与变量作用域
- Python函数闭包
- Python学习8--嵌入函数与闭包
- Python基础(六)函数作用域
- Python函数中的函数(闭包)用法实例
- Python自学之函数内嵌和闭包
- python函数基础(2)-----内置函数、作用域、闭包、递归
- python函数的闭包问题(内部函数与外部函数详述)
- 利用闭包返回一个计数器函数,每次调用它返回递增整数——Python学习笔记