Python 的命名空间
Python命名空间的本质:
一、命名空间的定义;
二、命名空间的查找顺序;
三、命名空间的生命周期;
四、通过locals()和globals() BIF访问命名空间。
重点是第四部分,我们将在此部分观察命名空间的内容。
一、命名空间(namespace)
二、命名空间查找顺序
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: antcolonies info = 'Address:' def func_father(country):
def func_son(area):
city = 'Shanghai' # 此处的city变量,覆盖了父函数的city变量
print('%s %s %s %s' %(info, country, city, area))
city = 'Beijing'
func_son('Changyang') func_father('China')
执行结果为: Address: China Shanghai Changyang
以上示例中,info在全局命名空间中,country在父函数的命名空间中,city、area在自己函数的命名空间中。
三、命名空间的生命周期
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: antcolonies i = 1 def func2():
print(i)
i = i +1 # UnboundLocalError: local variable 'i' referenced before assignment # def func2():
# print(i) # 1 func2()
造成以上情况的的原因:当创建命名空间时,python会检查代码并填充局部命名空间。在python运行那行代码之前,就发现了对i的赋值(即i作为该命名空间的一员产生一个引用(覆盖了外层的引用)),并把它添加到局部命名空间中。当函数执行时,python解释器认为i在局部命名空间中但没有值,所以会产生错误。
def func3():
y=123
del y # 从命名空间中删除该变量名,引用也被删除
print(y) func3()
#错误:UnboundLocalError: local variable 'y' referenced before assignment
#去掉"del y"语句后,运行正常
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: antcolonies i = 1 def func3():
i = 123
del i
print(i) func3() # UnboundLocalError: local variable 'i' referenced before assignment
四、命名空间的访问
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: antcolonies def func_1(i, str):
x = 123
print(locals()) func_1(1, 'first')
运行结果: {'i': 1, 'str': 'first', 'x': 123}
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: antcolonies '''
create on 2017-4-7
by antcolonies
''' import copy gstr = 'global string' def func_1(i, info):
x = 1234
print(locals()) func_1(1, 'first') if __name__ == '__main__':
print("the current scope's global varieties:\n%s" %str(globals())) '''(运行结果)
{'info': 'first', 'i': 1, 'x': 1234}
the current scope's global varieties:
{'__loader__': <_frozen_importlib.SourceFileLoader object at 0x000000000279E828>,
'__name__': '__main__',
'gstr': 'global string',
'__doc__': '\ncreate on 2017-4-7\nby antcolonies\n',
'__package__': None,
'__spec__': None,
'copy': <module 'copy' from 'D:\\Python\\lib\\copy.py'>,
'__cached__': None,
'func_1': <function func_1 at 0x00000000020DCBF8>,
'__builtins__': <module 'builtins' (built-in)>,
'__file__': 'E:/python14_workspace/s14/day05/test/variety_1.py'}
'''
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: antcolonies def func1(i, info):
x = 12345
print(locals())
locals()["x"]= 6789
print("x=",x) y=54321
func1(1 , "first")
globals()["y"]= 9876
print( "y=",y)
输出:
Python 的命名空间的更多相关文章
- Python进阶 - 命名空间与作用域
Python进阶 - 命名空间与作用域 写在前面 如非特别说明,下文均基于Python3 命名空间与作用于跟名字的绑定相关性很大,可以结合另一篇介绍Python名字.对象及其绑定的文章. 1. 命名空 ...
- 【Python】 命名空间与LEGB规则
命名空间与LEGB规则 之前隐隐约约提到过一些关于Python赋值语句的特殊性的问题,这个问题的根源就在于Python中的变量的命名空间机制和之前熟悉的C也好java也好都不太一样. ■ 命名空间 所 ...
- python的命名空间
Python的命名空间是Python程序猿必须了解的内容,对Python命名空间的学习,将使我们在本质上掌握一些Python中的琐碎的规则. 接下来我将分四部分揭示Python命名空间的本质:一.命名 ...
- Python中命名空间与作用域使用总结
1 引言 命名空间与作用域是程序设计中的基础概念,深入理解有助于理解变量的生命周期,减少代码中的莫名其妙bug.Python的命名空间与作用域与Java.C++等语言有很大差异,若不注意,就可能出现莫 ...
- Python Namespace - 命名空间
命名空间 命名空间 namespace 对 python 来说是一个非常核心的概念,整个 python 虚拟机运行的机制与 namespace 概念有这非常紧密的联系. 从'赋值'说起, python ...
- 飘逸的python - 保持命名空间的整洁
API的设计是一个艺术活.往往需要其简单.易懂.整洁.不累赘. 很多时候,我们在底层封装一个方法给高层用,而其它的方法只是为了辅助这个方法的. 也就是说我们只需要暴露这个方法就行,不用关心这个方法是怎 ...
- Python之命名空间、闭包、装饰器
一.命名空间 1. 命名空间 命名空间是一个字典,key是变量名(包括函数.模块.变量等),value是变量的值. 2. 命名空间的种类和查找顺序 - 局部命名空间:当前函数 - 全局命名空间:当前模 ...
- Python的命名空间及作用域
命名空间的分类 全局命名空间 是在程序从上到下被执行的过程中依次加载进内存的:放置了我们设置的所有变量名和函数名 局部命令空间 就是函数内部定义的名字:当调用函数的时候 才会产生这个名称空间 随着函数 ...
- Python函数——命名空间与闭包
前言 执行以下代码 def my_test(): x = 1 y = x+1 print(x) >> Traceback (most recent call last): File &qu ...
随机推荐
- Android wifi管理类:WifiAdmin
1.wifi的五种状态: WIFI_STATE_DISABLED WIFI网卡不可用 WIFI_STATE_DISABLING WIFI网卡正在关闭 WIFI_STATE_ENABLED ...
- APP 市场需求网址
http://mi.talkingdata.com/terminals.html?terminalType=4
- DropDownList判断值是否存在下拉列表中
//1.值是text string aa= Request.QueryString["CallReason"].ToString();//获取传值 if (DropDownList ...
- Linux性能指标解释+Oracle性能指标解释
Linux性能指标解释 类别 计数器名称 计数器描述 业界同行认可的资源阀值 memory Free(KB) 可用物理内存数 swap-in/out =0 Swap(KB) 已使用的虚拟内存数.在Li ...
- Kubernetes 集群部署(1) -- 自签 TLS 证书
集群功能各模块功能描述: Master节点:主要由四个模块组成,APIServer,schedule, controller-manager, etcd APIServer: APIServer负责对 ...
- Python之函数练习题
一.简述普通参数.指定参数.默认参数.动态参数的区别 普通参数:就是放入一个形参,当放入实参时,需要按照顺序给形参值. 指定参数:放入实参时是指定的,不用按照顺序给形参,都能让形参获得相应的参数. 默 ...
- Django个人博客开发 | 前言
本渣渣不专注技术,只专注使用技术,不是一个资深的coder,是一个不折不扣的copier 1.前言 自学 Python,始于 Django 框架,Scrapy 框架,elasticsearch搜索引擎 ...
- (16)break和continue
#(1)这里顺带说下pass # pass 过 的意思,防止代码报错,就是个占位的, if True: # 不允许代码块里面的内容为空,用pass占位 pass #(2)break (只能用在循环当中 ...
- apache 压缩 gzip
配置 编辑httpd.conf文件 去掉 #LoadModule headers_module modules/mod_headers.so 前面的注释# 去掉 #LoadModule deflate ...
- C语言中变量、全局变量与变量的作用域
什么是变量: 变量常量都是表征数据的一种形式:常量用来表示数据的值: 变量不仅可以用来表示数据的值:还可以用来存放数据:因为变量对应着一定的内存单元: 变量和常量必须先定义后使用. 变量名和常量名都是 ...