Python学习笔记——作用域

命名空间

1、基本

命名空间,就是一个名字作用的范围,也就是作用域。

打开ipython , 我定义一个变量a = 100
然后紧接着调用a

这里写图片描述

为什么可以找到a的值呢?因为a是在当前空间命名的,a的命名空间就是这个空间,我们可以我们就拿到a的值

这时候我在桌面上新建了一个文件如下

这里写图片描述

这时候有一个方法叫做text方法了。我可以调用吧?

这里写图片描述

唉?不对啊,我定义了啊为什么不让用啊

这就是因为当前命名空间里没有test这个方法。

demo.py是一个文件,我们可以把这个文件看成一个独立的命名空间,它和我们现在正在用的ipython是两个不同的命名空间,存在的地方都不一样肯定是无法调用的。

我们有方法调用么?

答案是肯定的

这里写图片描述

import将demo命名空间导入了进来,我们在当前命名空间中可以直接调用demo,通过demo调用demo命名空间下的属性或者方法。

当然还有另外一种导入方法

这里写图片描述

这种方法,直接将demo命名空间中的东西全部导入到了当前命名空间,所以我们可以直接调用test方法,而不是通过demo.test()对test方法进行调用了。

2、拓展

从上面文件的import demo我们知道,命名空间是可以嵌套的

我们打开ipython时,相当于开启了一个命名空间,这时候我们使用import demo命令,将demo文件导入了进来,demo也是一个命名空间,就形成了命名空间的嵌套。

globes 与 locals

1、locals()

locals()是用来查看当前命名空间中的元素的,包括方法和属性

这里写图片描述

我手动的把结果整理了一下,我们看这是以字典形式展示的,我们可以知道在test中有a,b,和test_in方法

我们在test方法外面调用locals()

这里写图片描述

我们可以把test方法也看做是一个命名空间,我们刚才在test调用locals()方法,就是看test方法内部的元素,这时候我们在外面调用就是看demo文件的内部的元素,test方法肯定是有了,

file‘: ‘C:\Users\Administrator\Desktop\demo.py’, 就是文件的绝对路径。

name‘: ‘main‘, 当前是谁调用的,模块导入的时候有用(稍后再讲)

其他的就不讲了,我也不知道是什么意思 (手动滑稽),有兴趣的可以自行百度,


关于 ‘name‘: ‘main

demo.py文件的代码

def test():
    a = 100
    b = 20
    def test_in():
        print('sy')
    print(locals())

print(locals())

这时候我通过import导入的时候(此处不区分from demo import * 还是 import demo)
实际上Python君都要执行一遍demo命名空间中的代码。

这里写图片描述

这里写图片描述

这时候print(locals())就被执行了。所以才会打印出一大堆的东西。

我们看到name和刚才的不一样了,变成了demo

假设demo文件是我们写好的一个功能模块文件,我们希望的是我们导入的时候不执行,调用的时候才会执行,这时候我们要利用name的不同返回值来处理。

这里写图片描述

这样处理后,在导入的时候就不会执行了。

这里写图片描述


2、globals()

刚才我们讲过命名空间是可以嵌套的。

globals()方法是用来查看外层命名空间。

这里写图片描述

这里写图片描述

一个是调用test命名空间中的globals方法,一个是调用test父命名空间中调用locals方法。两个结果是一样的

到这里我有个疑问,globals方法到底能查看外面的几层?

经过几次尝试,具体过程太多,我就不一一截图了,globals一共能查看外面一层,这一层不一定是上层,有可能是上上层,比如方法套方法如下图。

这里写图片描述

输入的结果,还是demo命名空间的元素。

LEGB规则

命名空间理解后,我们来探讨一个问题

如果要用一个变量,发现当前命名空间中没有定义,那我们是不是应该去上一层命名空间中寻找呢?

例如:

这里写图片描述

在test_in里面已经定义了a = 100
当在test_in中用到a的时候,自然是优先调用当前命名空间的a,即 L — locals()

如果test_in中没有呢?

我们之前学过闭包,假如说test是个闭包呢? 不就应该从test_in中找不到的变量应该去闭包中找啊

这里写图片描述

这就是E — Enclosing function locals

如果闭包里中找不到怎么办?那去哪里找?

这里写图片描述

在往上一层就是全局咯,即G — Global

如果全局找不到呢?再往上一层,就是Python内置的元素。即B — Builtin

Builtin怎么举例子呢? 其实上面早就有提现了,刚才我们是在一层一层的网上找元素变量a

那这次我们找print方法呢? test_in的命名空间中没有print方法的定义,test或者全局变量中都没有,这时候就去Builtin中去找,找到了就直接调用。

这就是寻找元素的规则 LEGB规则。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值