Python名称空间、作用域、函数的嵌套及关键字

一、名称空间,作用域

1.1 名称空间

  1. 1.1全局名称空间:
       在python解释器开始执行之后, 就会在内存中开辟一个空间, 每当遇到一个变量的时候, 就把变量名和值之间的关系记录下来, 但是当遇到函数定义的时候, 解释器只是把函数名读入内存, 表示这个函数存在了, 至于函数内部的变量和逻辑, 解释器是不关心的. 也就是说一开始的时候函数只是加载进来, 仅此而已, 只有当函数被调用和访问的时候, 解释器才会根据函数内部声明的变量来进行开辟变量的内部空间. 随着函数执行完毕, 这些函数内部变量占用的空间也会随着函数执行完毕而被清空.
       我们首先回忆一下Python代码运行的时候遇到函数是怎么做的,从Python解释器开始执行之后,就在内存中开辟里一个空间,每当遇到一个变量的时候,就把变量名和值之间对应的关系记录下来,但是当遇到函数定义的时候,解释器只是象征性的将函数名读如内存,表示知道这个函数存在了,至于函数内部的变量和逻辑,解释器根本不关心。
       等执行到函数调用的时候,Python解释器会再开辟一块内存来储存这个函数里面的内容,这个时候,才关注函数里面有哪些变量,而函数中的变量回储存在新开辟出来的内存中,函数中的变量只能在函数内部使用,并且会随着函数执行完毕,这块内存中的所有内容也会被清空。
      我们给这个“存放名字与值的关系”的空间起了一个名字------->命名空间。
    代码在运行开始,创建的存储“变量名与值的关系”的空间叫做全局命名空间
    在函数的运行中开辟的临时的空间叫做局部命名空间也叫做临时名称空间
      现在我们知道了,py文件中,存放变量与值的关系的一个空间叫做全局名称空间,而当执行一个函数时,内存中会临时开辟一个空间,临时存放函数中的变量与值的关系,这个叫做临时名称空间,或者局部名称空间。
      其实python还有一个空间叫做内置名称空间:内置名称空间存放的就是一些内置函数等拿来即用的特殊的变量:input,print,list等等,所以,我们通过画图捋一下:
    在这里插入图片描述
    那么这就是python中经常提到的三个空间。

总结一下:

  1. 全局命名空间-----> 我们直接在py文件中, 函数外声明的变量都属于全局命名空间

  2. 局部命名空间-----> 在函数中声明的变量会放在局部命名空间

  3. 内置命名空间-----> 存放python解释器为我们提供的名字, list, tuple, str, int这些都是内置命名空间

  4. 1.2 加载顺序
      所谓的加载顺序,就是这三个空间加载到内存的先后顺序,也就是这个三个空间在内存中创建的先后顺序,你想想他们能是同时创建么?肯定不是的,那么谁先谁后呢?我们捋顺一下:在启动python解释器之后,即使没有创建任何的变量或者函数,还是会有一些函数直接可以用的比如abs(-1),max(1,3)等等,在启动Python解释器的时候,就已经导入到内存当中供我们使用,所以肯定是先加载内置名称空间,然后就开始从文件的最上面向下一行一行执行,此时如果遇到了初始化变量,就会创建全局名称空间,将这些对应关系存放进去,然后遇到了函数执行时,在内存中临时开辟一个空间,加载函数中的一些变量等等。
      所以这三个空间的加载顺序为:内置命名空间(程序运行开始加载)----->全局命名空间(程序运行中:从上到下加载)--------->局部命名空间(程序运行中:调用时才加载)

  5. 1.3 取值顺序

    取值顺序就是引用一个变量,先从哪一个空间开始引用。这个有一个关键点:从哪个空间开始引用这个变量。我们分别举例说明:

    # 如果你在全局名称空间引用一个变量,先从全局名称空间引用,全局名# 称空间如果没有,才会向内置名称空间引用。
    num = 666
    print(num) # 666
    # 如果你在局部名称空间引用一个变量,先从局部名称空间引用,
    # 局部名称空间如果没有,才会向全局名称空间引用,全局名称空间在没有,就会向内置名称空间引用。
    num = 666
    def num1():
        num = 777
        print(num) # 777
    num1()
    

    所以空间的取值顺序与加载顺序是相反的,取值顺序满足的就近原则,从小范围到大范围一层一层的逐步引用。
    在这里插入图片描述

1.2 作用域

作用域就是作用范围, 按照生效范围来看分为全局作用域和局部作用域
全局作用域: 包含内置命名空间和全局命名空间. 在整个文件的任何位置都可以使用(遵循 从上到下逐⾏执行).

局部作用域: 在函数内部可以使用
作⽤域命名空间:
  1. 全局作用域: 全局命名空间 + 内置命名空间
  2. 局部作⽤域: 局部命名空间

  1. 2.1 内置函数globals(),locals()

    这两个内置函数放在这里讲是在合适不过的,他们就直接可以反映作用域的内容,有助于我们理解作用域的范围。

    globals(): 以字典的形式返回全局作用域所有的变量对应关系。

    locals(): 以字典的形式返回当前作用域的变量的对应关系。

    这里一个是全局作用域,一个是当前作用域,一定要分清楚,接下来,我们用代码验证:

    在全局作用域下打印,则他们获取的都是全局作用域的所有的内

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值