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正则表达式的使用范例详解
Aug 08 Python
python搭建微信公众平台
Feb 09 Python
使用Python的Twisted框架编写非阻塞程序的代码示例
May 25 Python
Python中字典(dict)合并的四种方法总结
Aug 10 Python
详解Django rest_framework实现RESTful API
May 24 Python
python解析xml简单示例
Jun 21 Python
python 利用pywifi模块实现连接网络破解wifi密码实时监控网络
Sep 16 Python
opencv设置采集视频分辨率方式
Dec 10 Python
python爬虫爬取监控教务系统的思路详解
Jan 08 Python
django实现将修改好的新模型写入数据库
Mar 31 Python
python 实现分组求和与分组累加求和代码
May 18 Python
Python 程序员必须掌握的日志记录
Aug 17 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
PHP截取中文字符串的问题
2006/07/12 PHP
支持oicq头像的留言簿(一)
2006/10/09 PHP
php 获取SWF动画截图示例代码
2014/02/10 PHP
php将文本文件转换csv输出的方法
2014/12/31 PHP
PDO::query讲解
2019/01/29 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
2020/02/21 PHP
in.js 一个轻量级的JavaScript颗粒化模块加载和依赖关系管理解决方案
2011/07/26 Javascript
JS中showModalDialog 的使用解析
2013/04/17 Javascript
运用JQuery的toggle实现网页加载完成自动弹窗
2014/03/18 Javascript
JavaScript开发人员的10个关键习惯小结
2014/12/05 Javascript
jQuery实现动画效果circle实例
2015/08/06 Javascript
微信支付如何实现内置浏览器的H5页面支付
2015/09/25 Javascript
JS弹出窗口插件zDialog简单用法示例
2016/06/12 Javascript
对js中回调函数的一些看法
2016/08/29 Javascript
jQuery过滤选择器用法示例
2016/09/12 Javascript
Vue实现双向数据绑定
2017/05/03 Javascript
jQuery.extend 与 jQuery.fn.extend的用法及区别实例分析
2018/07/25 jQuery
详解小程序中h5页面onShow实现及跨页面通信方案
2019/05/30 Javascript
微信小程序 腾讯地图显示偏差问题解决
2019/07/27 Javascript
Vue的双向数据绑定实现原理解析
2020/02/17 Javascript
vue中使用带隐藏文本信息的图片、图片水印的方法
2020/04/24 Javascript
利用Python绘制MySQL数据图实现数据可视化
2015/03/30 Python
python抓取网页中链接的静态图片
2018/01/29 Python
详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数
2018/04/18 Python
Python实现矩阵相乘的三种方法小结
2018/07/26 Python
python3.x实现base64加密和解密
2019/03/28 Python
Python HTML解析模块HTMLParser用法分析【爬虫工具】
2019/04/05 Python
使用python制作一个为hex文件增加版本号的脚本实例
2019/06/12 Python
REISS英国官网:伦敦High Street最受欢迎品牌
2016/12/21 全球购物
The North Face北面荷兰官网:美国著名户外品牌
2019/10/16 全球购物
几个Linux面试题笔试题
2012/12/01 面试题
优秀工会工作者事迹材料
2014/06/02 职场文书
宣传口号大全
2014/06/16 职场文书
2015年董事长秘书工作总结
2015/07/23 职场文书
2019年二手房买卖合同范本
2019/10/14 职场文书
解决python存数据库速度太慢的问题
2021/04/23 Python