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的Tornado框架实现图片上传及图片大小修改功能
Jun 30 Python
Python爬取附近餐馆信息代码示例
Dec 09 Python
利用python修改json文件的value方法
Dec 31 Python
python感知机实现代码
Jan 18 Python
python 实现矩阵上下/左右翻转,转置的示例
Jan 23 Python
python使用pymongo操作mongo的完整步骤
Apr 13 Python
python实现批量视频分帧、保存视频帧
May 31 Python
对django views中 request, response的常用操作详解
Jul 17 Python
详解Python3迁移接口变化采坑记
Oct 11 Python
Python autoescape标签用法解析
Jan 17 Python
keras 实现轻量级网络ShuffleNet教程
Jun 19 Python
python中24小时制转换为12小时制的方法
Jun 18 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
CakePHP框架Session设置方法分析
2017/02/23 PHP
PHP实现的最大正向匹配算法示例
2017/12/19 PHP
JQuery扩展插件Validate 3通过参数设置错误信息
2011/09/05 Javascript
轻松创建nodejs服务器(7):阻塞操作的实现
2014/12/18 NodeJs
Javascript 正则表达式实现为数字添加千位分隔符
2015/03/10 Javascript
node网页分段渲染详解
2016/09/05 Javascript
JavaScript学习笔记整理_简单实现枚举类型,扑克牌应用
2016/09/19 Javascript
基于angular中的重要指令详解($eval,$parse和$compile)
2016/10/21 Javascript
nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
2016/12/30 NodeJs
ES6生成器用法实例分析
2017/04/10 Javascript
微信小程序实现滑动删除效果
2017/05/19 Javascript
element-ui循环显示radio控件信息的方法
2018/08/24 Javascript
Vue组件简易模拟实现购物车
2020/12/21 Vue.js
[01:16:12]完美世界DOTA2联赛PWL S2 FTD vs Inki 第一场 11.21
2020/11/23 DOTA
Python(Tornado)模拟登录小米抢手机
2013/11/12 Python
Python使用Dijkstra算法实现求解图中最短路径距离问题详解
2018/05/16 Python
numpy中以文本的方式存储以及读取数据方法
2018/06/04 Python
对python的bytes类型数据split分割切片方法
2018/12/04 Python
python写程序统计词频的方法
2019/07/29 Python
python二进制读写及特殊码同步实现详解
2019/10/11 Python
Django密码存储策略分析
2020/01/09 Python
解决Jupyter notebook中.py与.ipynb文件的import问题
2020/04/21 Python
python神经网络编程实现手写数字识别
2020/05/27 Python
python读取excel进行遍历/xlrd模块操作
2020/07/12 Python
Python实现文件压缩和解压的示例代码
2020/08/12 Python
5分钟实现Canvas鼠标跟随动画背景
2019/11/18 HTML / CSS
h5页面背景图很长要有滚动条滑动效果的实现
2021/01/27 HTML / CSS
英国太阳镜品牌:Taylor Morris Eyewear
2018/04/18 全球购物
小学班主任培训方案
2014/06/04 职场文书
商务英语专业毕业生求职信
2014/07/06 职场文书
师范毕业生求职信
2014/07/11 职场文书
男性健康日的活动方案
2014/08/18 职场文书
学雷锋献爱心活动总结
2015/05/11 职场文书
2016年春季运动会广播稿
2015/08/19 职场文书
2016年师德学习心得体会
2016/01/12 职场文书
pytorch锁死在dataloader(训练时卡死)
2021/05/28 Python