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 ...
随机推荐
- [译]我们应该在HTML文档中何处放script标签
本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...
- 2014年第五届蓝桥杯省赛试题(JavaA组)
1.结果填空 (满分2分)2.结果填空 (满分6分)3.结果填空 (满分7分)4.代码填空 (满分4分)5.代码填空 (满分12分)6.结果填空 (满分12分)7.结果填空 (满分9分)8.程序设计( ...
- 【Arcgis for android】spatialite打开shapefile
互联网(free and share) 本文参考下面的博文: http://blog.csdn.net/arcgis_all/article/details/8232976 Preparation: ...
- Vue执行方法,方法获取data值,设置data值,方法传值
方法写在methods中 v-on:click="run()" @click="run()" 方法获取data中的数据通过this.数据获取 方法设置data中 ...
- Linq 和 Lambda 查询中按照多个值进行分组GroupBy
创建要查询的对象: class Employee { public int ID { get;set; } public string FName { get; set; } public int A ...
- 重新排序文本文件(txt)里面的内容
近段时间,Insus.NET学习练习物件与对象,怎样创建实际环境中的对象.对读取文本文件以及分析文本文件作为目标.因此搜索论坛一些例子,就如下面这题,实现的方法分享给大家. 以文本行作为一个对象,所以 ...
- [hdu 2089] 不要62 数位dp|dfs 入门
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:求[n, m]区间内不含4和62的数字个数. 这题有两种思路,直接数位dp和dfs 数位d ...
- Kafka 练习题
一.选择题 Kafka服务器默认能接收的最大消息是多大? (单选) A A:1M B:10M C:100M D:没有大小限制,因为支持大数据 2.Kafka的特性(多选) ABCD A:高吞吐量.低 ...
- linux read和write
int write(int fd, const void *buf, size_t count); 如果是堵塞fd,则返回值是count,或者是0,-1: 如果是非堵塞fd,则返回值是写入的字节数,或 ...
- kuangbin专题七 HDU1698 Just a Hook (区间设值 线段树)
In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of the heroes. T ...