Python之函数作用域与闭包

'''
命名空间:存放名称与值对应关系的空间
命名空间分类:
  内置命名空间:
     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>,)
# --------闭包:内部函数引用了外部作用域非全局作用域名字的引用,此内部函数称为闭包

猜你喜欢

转载自blog.csdn.net/qq_40199698/article/details/87892693