Python学习笔记——作用域

来源:互联网 发布:python 拉钩 源代码 编辑:程序博客网 时间:2024/06/05 06:13

命名空间

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规则。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 我是代购卖家被买家投诉偷税怎么办 天猫盒子内存不够怎么办 天猫品牌申请不通过怎么办 天猫商家发货发个空包裹怎么办 无限流量怎么办没有4g 海外直邮身份证过期了怎么办 买车的人不过户怎么办 天猫精灵球泡离线怎么办 花呗被骗了2万怎么办 天猫公司变更地址发票怎么办 支付宝自助解限怎么办 支付宝16岁限额怎么办 支付宝提不了现怎么办 支付宝余额受限需要身份证怎么办 微信被骗了6000怎么办 被代运营骗了该怎么办 淘宝店铺过节放假无人打理怎么办 淘宝店太久没打理出现未开店怎么办 淘宝店关了售后怎么办 发货运单号发错了怎么办 天猫积分为零怎么办 山东聊城小型车脱审一年怎么办? 廉租房如果夫妻离婚怎么办 淘宝客服不给退货怎么办 天猫客服打字慢怎么办 京东买的kindle坏了怎么办 欧巴怎么办韩语怎么写 聚划算淘宝口令打不开怎么办 道聚城白银礼包下架怎么办 聚星输了很多钱怎么办 弹力运动裤被烟烧了个洞怎么办 生完宝宝胯宽怎么办 黑色纯棉裤子洗的发白怎么办 金盾保险柜密码忘了怎么办 装修好的房子漏水怎么办 刚装修的房子墙面开裂怎么办 刚装修的房子有味道怎么办 代销产品规格填写不完整怎么办 我的信息被泄露怎么办 进入不良网站手机发信息怎么办 发不良信息被停机了怎么办