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 相关文章推荐
PHP魔术方法__ISSET、__UNSET使用实例
Nov 25 Python
python实现用户登陆邮件通知的方法
Jul 09 Python
利用python批量检查网站的可用性
Sep 09 Python
Python 正则表达式入门(中级篇)
Dec 07 Python
python实现下载整个ftp目录的方法
Jan 17 Python
Python实现公历(阳历)转农历(阴历)的方法示例
Aug 22 Python
Python格式化输出%s和%d
May 07 Python
Python封装原理与实现方法详解
Aug 28 Python
如何使用repr调试python程序
Feb 28 Python
解决python中显示图片的plt.imshow plt.show()内存泄漏问题
Apr 24 Python
Python sklearn中的.fit与.predict的用法说明
Jun 28 Python
python上下文管理的使用场景实例讲解
Mar 03 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
摩卡咖啡
2021/03/03 咖啡文化
精美漂亮的php分页类代码
2013/04/02 PHP
如何用php获取文件名后缀
2013/06/09 PHP
smarty半小时快速上手入门教程
2014/10/27 PHP
php实现比较全的数据库操作类
2015/06/18 PHP
php登录超时检测功能实例详解
2017/03/21 PHP
PHP+AjaxForm异步带进度条上传文件实例代码
2017/08/14 PHP
PHP大文件分片上传的实现方法
2018/10/28 PHP
使用Js让Html中特殊字符不被转义
2013/11/05 Javascript
Node.js 服务器端应用开发框架 -- Hapi.js
2014/07/29 Javascript
jQuery动态创建html元素的常用方法汇总
2014/09/05 Javascript
Javascript 构造函数详解
2014/10/22 Javascript
JS扩展方法实例分析
2015/04/15 Javascript
C#中使用迭代器处理等待任务
2015/07/13 Javascript
jquery实现的点击翻书效果代码
2015/11/04 Javascript
jQuery插件开发发送短信倒计时功能代码
2017/05/09 jQuery
深入理解JavaScript创建对象的多种方式以及优缺点
2017/06/01 Javascript
jQuery实现键盘回车搜索功能
2017/07/25 jQuery
浅谈使用React.setState需要注意的三点
2017/12/18 Javascript
axios的拦截请求与响应方法
2018/08/11 Javascript
解决layui中的form表单与button的点击事件冲突问题
2018/08/15 Javascript
微信小程序学习笔记之获取位置信息操作图文详解
2019/03/29 Javascript
layer ui 导入文件之前传入数据的实例
2019/09/23 Javascript
python实现bitmap数据结构详解
2014/02/17 Python
用python处理MS Word的实例讲解
2018/05/08 Python
浅谈Python的list中的选取范围
2018/11/12 Python
python隐藏终端执行cmd命令的方法
2019/06/24 Python
what is the difference between ext2 and ext3
2013/11/03 面试题
授权委托书样本
2014/04/03 职场文书
中国梦我的梦演讲稿
2014/04/23 职场文书
励志演讲稿范文
2014/04/29 职场文书
观看《周恩来的四个昼夜》思想汇报
2014/09/12 职场文书
2015年小学生新年寄语
2014/12/08 职场文书
培训班开班主持词
2015/07/02 职场文书
小学运动会加油词
2015/07/18 职场文书
win11系统中dhcp服务异常什么意思? Win11 DHCP服务异常修复方法
2022/04/08 数码科技