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 相关文章推荐
py2exe 编译ico图标的代码
Mar 08 Python
python实现随机密码字典生成器示例
Apr 09 Python
Python的批量远程管理和部署工具Fabric用法实例
Jan 23 Python
详谈Python2.6和Python3.0中对除法操作的异同
Apr 28 Python
Python实现获取命令行输出结果的方法
Jun 10 Python
Python实现发送与接收邮件的方法详解
Mar 28 Python
numpy中loadtxt 的用法详解
Aug 03 Python
在IPython中执行Python程序文件的示例
Nov 01 Python
python将音频进行变速的操作方法
Apr 08 Python
python删除某个目录文件夹的方法
May 26 Python
用pip给python安装matplotlib库的详细教程
Feb 24 Python
Python自动化之批量处理工作簿和工作表
Jun 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
PHP也可以?成Shell Script
2006/10/09 PHP
一个PHP的String类代码
2010/04/20 PHP
PHP编程最快明白(第一讲 软件环境和准备工作)
2010/10/25 PHP
php中利用explode函数分割字符串到数组
2014/02/08 PHP
php使用curl存储cookie的示例
2014/03/31 PHP
php rsa 加密,解密,签名,验签详解
2016/12/06 PHP
PHP 扩展Memcached命令用法实例总结
2020/06/04 PHP
jQuery实现只允许输入数字和小数点的方法
2016/03/02 Javascript
jquery获取点击控件的绝对位置简单实例
2016/10/13 Javascript
jQuery实现单击按钮遮罩弹出对话框效果(2)
2017/02/20 Javascript
实例解析js中try、catch、finally的执行规则
2017/02/24 Javascript
深入理解nodejs中Express的中间件
2017/05/19 NodeJs
Vue2几种常见开局方式详解
2017/09/09 Javascript
JS实现前端页面的搜索功能
2018/06/12 Javascript
微信小程序调用微信支付接口的实现方法
2019/04/29 Javascript
微信小程序onShareTimeline()实现分享朋友圈
2021/01/07 Javascript
[01:20]DOTA2更新全新英雄 天涯墨客现已加入游戏
2018/08/25 DOTA
日常整理python执行系统命令的常见方法(全)
2015/10/22 Python
Python实现Youku视频批量下载功能
2017/03/14 Python
Python基于生成器迭代实现的八皇后问题示例
2018/05/23 Python
python中 * 的用法详解
2019/07/10 Python
python实现切割url得到域名、协议、主机名等各个字段的例子
2019/07/25 Python
Python单元测试工具doctest和unittest使用解析
2019/09/02 Python
基于keras 模型、结构、权重保存的实现
2020/01/24 Python
详解基于Scrapy的IP代理池搭建
2020/09/29 Python
基于ccs3的timeline时间线实现方法
2020/04/30 HTML / CSS
Boutique 1美国:阿联酋奢侈时尚零售商
2017/10/16 全球购物
下述程序的作用是计算机数组中的最大元素值及其下标
2012/11/26 面试题
J2EE系统只能是基于web
2015/09/08 面试题
护理实习自我鉴定
2013/12/14 职场文书
会计职业生涯规划书
2014/01/13 职场文书
导游个人求职信范文
2014/03/23 职场文书
《诚实与信任》教学反思
2014/04/10 职场文书
财务内勤岗位职责
2014/04/17 职场文书
2015年青年教师工作总结
2015/05/25 职场文书
2019年度开业庆典祝福语大全!
2019/07/05 职场文书