最近一直看一本python经典教材——《Python学习手册》,因为之前都是突击学的,也没有仔细看一些经典教材,所以感觉自己的基础掌握的还不是很好,虽然网络上资源多,但我觉得还是有必要买本教材来认真的读一读,底层基础决定上层建筑嘛,基础打牢一些,对今后的编程还是会有些帮助的。

今天来谈谈python中的命名空间和作用域相关的概念(其实很多面向对象程序语言都有这个概念,我记得自己当初自学C++时就接触过这两个概念),希望对有需要的朋友有帮助,当然我更希望你能找本教材来看看。

命名空间是一个保存变量名的地方,当在程序中使用变量名时,python创建、改变或者查找都是在所谓的命名空间中进行的。当我们谈论到搜索变量名对应于代码的值的时候,作用域这个术语指的就是命名空间,也就是说在代码中,变量名被赋值的位置决定了这个变量名能被访问到的访问

python的变量名在第一次赋值时就已经创建,并且必须经过赋值后才能使用,python会将一个变量名被赋值的地点关联为一个特点的命名空间(也就是说命名空间就是名字到实际python对象的一个映射,命名空间是一个 字典(dictionary) ,它的键就是变量名,它的值就是那些变量的值,我们知道python中一切皆对象,但变量名并不是对象,类型是属于对象,而不属于变量名),也就是说在代码中给一个变量赋值的地方决定了这个变量存在于哪个命名空间。

函数定义了本地作用域,函数除了打包代码外,函数还为程序增加了一个额外的命名空间层:在默认情况下,一个函数的所有变量名都与函数命名空间相关联,这就意味着:一个def内定义的变量名能够被def内代码使用,不能在函数外部引用这样的变量名;def与def的变量名不发生冲突,两者相互独立,互不影响。

模块定义的是全局作用域。本地作用域与全局作用域有如下关系:

. 内嵌的模块是全局作用域。每个模块都是一个全局作用域,对于外部的全局变量就变成了模块的属性

. 全局作用域的作用范围仅限于单个文件。这里的“全局”指在一个文件顶层的变量名仅对于这个文件内部的代码而言是全局的,在python中没有一个基于当个文件的、无所不包的情景文件的全局作用域。如果其它文件想引用某一个文件的全局变量,必须先导入该模块文件才能使用这个模块中定义的变量名

. 每次对函数调用都会创建了一个新的本地作用域。

. 赋值的变量名除非声明为全局变量,否则均为本地变量。在默认情况下,使用函数定义内部的变量名是位于本地作用域内的。如果想给一个在函数内部却位于模块文件顶层的变量嘛赋值(也就是说想在函数内部给全局变量名赋值)就需要在函数内部使用global语句声明,否则按照LEGB原则,函数内部会认为它是本地变量。如下:#coding=utf-8

X = 99 #全局变量

def fun():

X = 100 #由于没有用global声明,根据LEGB原则,函数认为它是本地变量

return X

print X

print fun()

#最后输出结果是99,100;并不是100,100;X值没有发生改变,是因为函数认为X是本地变量,

#如果想函数认为X是全局变量,用global声明。

. 所有变量名都可以归纳为本地,全局或者内置

那么,什么是“LEGB”呢?

"LEGB"是python中四层命名空间的英文名字首字母的缩写。

最里面的一层是L(local),表示在一个函数定义中,而且在这个函数里面没有再包含函数的定义。

第二层E(enclosing function),表示在一个函数定义中,但这个函数里面还包含有函数的定义,其实L层和E层只是相对的。

第三层G(global),是指一个模块的命名空间,也就是说在一个.py文件中定义的标识符,但不在一个函数中。

第四层B(builtin),是指python解释器启动时就已经具有的命名空间,之所以叫builtin是因为在python解释器启动时会自动载入__builtin__模块,这个模块中的list、str等内置函数的就处于B层的命名空间中。

变量名引用分为三个作用域进行查找:首先是本地,之后是函数内(如果有的话),之后是全局,最后是内置

不同的命名空间在不同的时刻创建,有不同的生存期。

1、内置命名空间在 Python 解释器启动时创建,会一直保留,不被删除。

2、模块的全局命名空间在模块定义被读入时创建,通常模块命名空间也会一直保存到解释器退出。

3、当函数被调用时创建一个本地命名空间,当函数返回结果 或 抛出异常时,被删除。每一个递归调用的函数都拥有自己的命名空间。

下面来讲讲python的两个内置函数locals() 和 globals()

1.本地命名空间可以用locals()来访问

locals 返回一个名字/值对的 dictionary。这个 dictionary 的键是字符串形式的变量名字,dictionary 的值是变量的实际值。#coding=utf-8

def func(i,y):

x = 666

print locals()

func(88,"Good")

输出结果是{'y': 'Good', 'x': 666, 'i': 88},

如果你知道这个技巧的话,在利用Django框架写视图函数时,就可以省很多事了,比如下面例子:def def current_datetime(request):

now = datetime.datetime.now()

return render_to_response('current_datetime.html',

{'current_date': now})

我们可以这样写:def current_datetime(request):

current_date = datetime.datetime.now()

return render_to_response('current_datetime.html', locals())

当要返回给前段的值比较多时,这样写是不是很方便呢?

2.全局 (模块级别)命名空间可以通过 globals() 来访问#coding=utf-8

import copy

from copy import deepcopy

gstr = "global string"

def func1(i, info):

x = 12345

print(locals())

func1(1 , "first")

if __name__ == "__main__":

print("the current scope's global variables:")

dictionary=globals()

print(dictionary)

输出

{'info': 'first', 'x': 12345, 'i': 1}

the current scope's global variables:

{'func1': ,

'gstr': 'global string',

'dictionary': {...},

'__builtins__': ,

'__file__': '/home/liulonghua/test/12.py',

'__package__': None,

'deepcopy': ,

'__name__': '__main__',

'copy': ,

'__doc__': None

}

3.locals 与 globals 之间的一个重要的区别

locals 是只读的,globals 不是

locals 实际上没有返回局部名字空间,它返回的是一个拷贝。所以对它进行改变对局部名字空间中

的变量值并无影响。

globals 返回实际的全局名字空间,而不是一个拷贝。所以对 globals 所返回的 dictionary 的任何

的改动都会直接影响到全局变量。

python文件作用域是什么_Python中的命名空间、作用域以及locals() 和 globals()相关推荐

  1. python文件操作的方法_python中文件操作的基本方法

    在python中对一个文件进行操作,分为三大步:打开,操作,关闭 首先创建一个文件hello,里面内容为hello world 一.打开一个文件 #open('文件名或文件路径','操作模式',文件里 ...

  2. python中变量的作用域有几种_Python中变量的作用域(variable scope)

    http://www.crifan.com/summary_python_variable_effective_scope/ 解释python中变量的作用域 示例: 1.代码版 #!/usr/bin/ ...

  3. python中的作用域以及优先级_Python中的作用域规则详解

    Python是静态作用域语言,尽管它自身是一个动态语言.也就是说,在Python中变量的作用域是由它在源代码中的位置决定的,这与C有些相似,但是Python与C在作用域方面的差异还是非常明显的. 接下 ...

  4. python中函数的作用域_Python中的函数作用域

    在python中,一个函数就是一个作用域 name = 'xiaoyafei' def change_name(): name = '肖亚飞' print('在change_name里的name:', ...

  5. python中函数作用域_Python中的函数作用域

    在python中,一个函数就是一个作用域 name = 'xiaoyafei' def change_name(): name = '肖亚飞' print('在change_name里的name:', ...

  6. python函数中变量的作用域_Python中变量的作用域(variable scope)

    此文目的 此文主要讨论和总结一下,Python中的变量的作用域(variable scope). 目的在于,通过代码,图解,文字描述,使得更加透彻的了解,Python中的变量的作用域: 以避免,在写代 ...

  7. load()是python文件操作的函数_python基础总结(函数,文件操作)

    divmod(a, b)#分别取商和余数 float([x])#将一个字符串或数转换为浮点数.如果无参数将返回0.0 int([x[, base]])#将一个字符转换为int类型,base表示进制 l ...

  8. python文件操作和模块_Python(五)--模块与文件操作

    Python(五)–模块与文件操作 模块和包 模块 模块是包含Python定义和语句的文件,把一组相关函数或代码组织到一个文件中,一个文件即一个模块.模块的文件名 = 模块名+后缀.py 模块之间代码 ...

  9. python tkinter 下拉框_python中tkinter入门之Menu创建顶级菜单、下拉菜单和弹出菜单。...

    创建顶级菜单 Menu 组件通常被用于实现应用程序上的各种菜单.使用add_command可以添加菜单内容.创建后通过root.config()添加到窗口上. from tkinter import ...

最新文章

  1. keil如何添加h文件_【专栏】Keil系列教程
  2. 什么是神经网络在object detection的应用?cascade classifier,卷积神经网络,迁移学习
  3. IE8开发人员工具资料
  4. MVC4下配置log4net 五部曲
  5. 初学jsp课,一个基于jsp+javabean+servlet+sql server小型房源网站,实现了用户表,房源表,及留言板的增删查改。使用deamwear编译器
  6. MapReduce综合学习含Wordcount案例
  7. ActiveReports 9实战教程(1): 手把手搭建环境Visual Studio 2013 社区版
  8. MySQL客户端mysql常用命令
  9. 如何在eclipse中使用XYLayout布局?在此介绍如何把XYLayout导入到eclipse .
  10. yolov3视频检测图像上显示准确率
  11. python测试app性能_App性能测试
  12. 微信登录OpenId和UnionId区别
  13. ImageAI (四) 使用Python快速简单实现自定义预测模型的训练 Custom Model Training
  14. Linux 内核 颜色,Linux操作系统内核版的表示方法是( )
  15. 英文论文查重率怎么算?
  16. 【homework】类与对象的基础应用(Student类)
  17. 八位知名设计师评iOS7:新鲜但复杂
  18. linux抓bpdu包,用Python发送手工构建的BPDU(生成树协议包)
  19. Python科学计算-Numpy和Pandas学习笔记(二)-Numpy的基本运算(chaochao`s Blog)
  20. 网易云歌单重合率2.0

热门文章

  1. QueryWrapper 或用法.or()
  2. 营销学之父科特勒:互联网思维要选准卖点
  3. 【数据包捕获技术】libpcap原理
  4. 数字孪生=仿真?一文了解数字孪生技术和应用场景
  5. 【程序人生】2022年目标
  6. 分享77个PSD,总有一款适合您
  7. Python re.findall() 函数正则表达式(一)
  8. JVM常见知识(一)
  9. 软件构造课外笔记:有意义的命名
  10. latex添加作者照片和作者简介