名称空间

名称空间

什么是名称空间(namespaces)

  用于存放变量名与变量值绑定关系的地方(类似于民政局)

 

名称空间的分类(重要)

  1.内置名称空间

    python解释器提前给你定义好的 

print()
len()
...

 

  2.全局名称空间

    在py文件中顶格编写的代码运行之后都会存入全局名称空间

name = 'jason'  # name全局
def func():  # func全局
   pass
if 1:
   a = 123  # a全局
for i in range(10):
   print(i)  # i全局
while True:
   a = 123  # a全局

  

  3.局部名称空间

    函数体代码运行之后产生的都是局部名称空间

 

  4.存活周期

    1.内置名称空间
      python解释器启动与关闭而创建和销毁
    2.全局名称空间
      随着py文件的运行与结束而创建和销毁
    3.局部名称空间
      随着函数体代码的执行与结束而创建和销毁

 

查看函数的名称空间

  locals() 查看局部的

  globals() 查看全局的

 

名字的查找顺序  

  在查找名字的时候 要先确定自己当前在哪

    1.如果你在局部
      局部 >>> 全局 >>> 内置
    2.如果你在全局
      全局 >>> 内置   

  局部名称空间的嵌套

'''函数在定义阶段名字的查找顺序就已经固定死了(特例)'''
x = 111
def f1():
    x = 222
    def f2():
        x = 333
        def f3():
            x = 444
            def f4():
                x = 555
                print(x)
                # x = 555  特例
            f4()
        f3()
    f2()
# 通过调用f1 执行所有的函数
f1()

 

名称空间的作用域

  作用域
    名称空间所能够作用的范围

  内置名称空间
    程序任何阶段任何位置均可使用(全局有效)
  全局名称空间
    程序任何阶段任何位置均可使用(全局有效)
  局部名称空间
    一般情况下只在各自的局部名称空间中有效

 

global与nonlocal关键字使用

  global        局部修改全局名称空间

  nonlocal    局部修改外层局部名称空间

x = 111
def index():
    # 局部修改全局变量 需要使用关键字声明
    global x
    x = 222
index()
print(x)


name_list = ['jason', 'kevin']
def index():
    name_list.append('heiheihei')
index()
print(name_list)
"""
如果想在局部修改全局数据
    如果数据为不可变类型则需要关键字global声明
    如果数据为可变类型则无需关键字global声明
"""
def index():
    # x = 111
    l1 = [11,22]
    def func():
        # 内部局部修改外部局部
        l1.append(333)
    func()
    print(l1)
index()
"""
如果想要在内部的局部修改外部局部的不可变类型数据
需要关键字nonlocal声明
"""

 

END

 

posted @ 2021-11-16 15:01  Snails蜗牛  阅读(44)  评论(0编辑  收藏  举报