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规则。
- Python学习笔记——作用域
- Python学习笔记:作用域
- python 学习笔记—— #(井号)的作用
- python 学习笔记-变量作用域
- Javascript学习笔记——作用域
- python学习:作用域
- Python学习笔记-1(变量、类型、函数、类、作用域)
- Python学习笔记:作用域和命名空间
- 谭子python学习笔记--函数定义及作用域
- 12. Python脚本学习笔记十二作用域与递归
- JavaScript学习笔记三——作用域
- ECMAScript6学习笔记——块级作用域
- JS学习笔记——作用域链
- 【C++】学习笔记五十——类作用域
- Spring实战学习笔记——bean的作用域
- python——作用域
- Python——作用域
- php——学习笔记,怪异的变量作用域以及静态变量作用域
- HDU 6112 今夕何夕(模拟)
- AAA级草资源制作插件Volume Grass
- Unity内嵌浏览器脚本
- KinectManager 组件说明
- Unity3D开启协程倒计时
- Python学习笔记——作用域
- unity meta文件
- 文件的基本操作---复制/移动或删除文件
- 【POJ】3268
- Unity删除所有子物体保留父物体的2种方式
- 理解 Linux 中的 关机命令
- There are inconsistent line endings in the 'xxx' script. Some are Mac OS X (UNIX) and some are Windows
- unity3d 获取系统硬件信息
- C# 中获取CPU序列号/网卡mac地址