Python中使用动态变量名的方法


Posted in Python onMay 06, 2014

如果要写一个程序,让x1为1,x2为2,然后直到x100为100,你会怎么做?

在C这种静态语言里,变量名这个标识符实际上会被编译器直接翻译成内存地址,所以除了手动设置每个变量的值以外,没办法做到这点。而Python这种动态语言则是可以做到的。

最容易想到的自然是eval,但是实际上根本不需要这种危险的东西,因为Python的变量名就是一个字典的key而已。要获取这个字典,直接用locals和globals函数即可。

因此这个程序可以这样实现:

>>> names = locals()
>>> for i in xrange(1, 101):
...   names['x%s' % i] = i
...
>>> x1
1
>>> x2
2
>>> x100
100

不过你也许会说这个例子没什么用,毕竟用数组来实现更为实用。

那么再考虑一个例子:服务器使用一种对象数据库,可以直接保存对象到数据库中。服务器列出目前支持的所有类,而用户想添加一个不存在于列表中的类,于是向服务器发送一段JSON或XML文本。服务器解析这段文本,将它转换成一个class对象,并且设置类名。之后用户就可以随意生成这个类的对象。
关键是这个数据库和类名相关,你不能用一个通用的Object类来保存所有的对象,否则查询时就乱套了。
而恰巧的是,还就有人在GAE论坛上提出了这个需求,而只会Java的他最终只能放弃。

当然,你想用来恶搞也行:

>>> locals()['True'] = False
>>> True
False

另一个用处就是测试一个变量名是否已经存在。标准的做法是try...except一个NameError异常,实际上直接用in locals()或in globals()就能判断了。
顺便再介绍另一种奇怪的方法,不知道有人这样写过没:

>>> import __main__
>>> hasattr(__main__, 'x')
False
>>> setattr(__main__, 'x', 1)
>>> x
1
>>> hasattr(__main__, 'x')
True

当然,没有任何人推荐你这样写,我也不会。

最后,除了动态设置变量名,动态删除也是可以的,例如del locals()['x1']。同样,delattr也是可用的。

Python 相关文章推荐
Python实现获取某天是某个月中的第几周
Feb 11 Python
在Python的Django框架中更新数据库数据的方法
Jul 17 Python
使用python实现个性化词云的方法
Jun 16 Python
python中requests爬去网页内容出现乱码问题解决方法介绍
Oct 25 Python
浅谈Python黑帽子取代netcat
Feb 10 Python
python和pygame实现简单俄罗斯方块游戏
Feb 19 Python
Pycharm代码无法复制,无法选中删除,无法编辑的解决方法
Oct 22 Python
python读取txt文件,去掉空格计算每行长度的方法
Dec 20 Python
python3实现斐波那契数列(4种方法)
Jul 15 Python
python批量解压zip文件的方法
Aug 20 Python
浅析pip安装第三方库及pycharm中导入第三方库的问题
Mar 10 Python
基于python实现模拟数据结构模型
Jun 12 Python
python完成FizzBuzzWhizz问题(拉勾网面试题)示例
May 05 #Python
使用python实现拉钩网上的FizzBuzzWhizz问题示例
May 05 #Python
python通过scapy获取局域网所有主机mac地址示例
May 04 #Python
python使用内存zipfile对象在内存中打包文件示例
Apr 30 #Python
python数据结构之二叉树的统计与转换实例
Apr 29 #Python
python数据结构之二叉树的遍历实例
Apr 29 #Python
python数据结构之二叉树的建立实例
Apr 29 #Python
You might like
分享下php5类中三种数据类型的区别
2015/01/26 PHP
Laravel获取所有的数据库表及结构的方法
2019/10/10 PHP
JQuery 构建客户/服务分离的链接模型中Table分页代码效率初探
2010/01/22 Javascript
通过下拉框的值来确定输入框是否可以为空的代码
2011/10/18 Javascript
Jquery跳到页面指定位置的方法
2014/05/12 Javascript
教你用jquery实现iframe自适应高度
2014/06/11 Javascript
浅谈 javascript 事件处理
2015/01/04 Javascript
推荐阅读的js快速判断IE浏览器(兼容IE10与IE11)
2015/12/13 Javascript
每个程序员都需要学习 JavaScript 的7个理由小结
2016/09/03 Javascript
JS排序算法之冒泡排序,选择排序与插入排序实例分析
2017/12/13 Javascript
JavaScript引用类型Date常见用法实例分析
2018/08/08 Javascript
nodejs更新package.json中的dependencies依赖到最新版本的方法
2018/10/10 NodeJs
开发用到的js封装方法(20种)
2018/10/12 Javascript
Vue.js特性Scoped Slots的浅析
2019/02/20 Javascript
小程序实现日历左右滑动效果
2019/10/21 Javascript
js实现二级联动简单实例
2020/01/11 Javascript
JS实现打砖块游戏
2020/02/14 Javascript
js+canvas实现画板功能
2020/09/13 Javascript
基于ajax实现上传图片代码示例解析
2020/12/03 Javascript
python追加元素到列表的方法
2015/07/28 Python
Python django实现简单的邮件系统发送邮件功能
2017/07/14 Python
Python matplotlib画图实例之绘制拥有彩条的图表
2017/12/28 Python
python3中获取文件当前绝对路径的两种方法
2018/04/26 Python
python中dict使用方法详解
2019/07/17 Python
pytorch 获取层权重,对特定层注入hook, 提取中间层输出的方法
2019/08/17 Python
python同义词替换的实现(jieba分词)
2020/01/21 Python
tensorflow 获取checkpoint中的变量列表实例
2020/02/11 Python
CSS3弹性盒模型开发笔记(一)
2016/04/26 HTML / CSS
印度尼西亚值得信赖的第一家网店:Bhinneka
2018/07/16 全球购物
创造美妙香氛体验:Aera扩散器和香水
2018/11/25 全球购物
EJB的激活机制
2013/10/25 面试题
《学会合作》教学反思
2014/04/12 职场文书
电影雨中的树观后感
2015/06/15 职场文书
企业安全生产检查制度
2015/08/06 职场文书
Java 深入探究讲解简单工厂模式
2022/04/07 Java/Android
Java实现简单小画板
2022/06/10 Java/Android