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中wx将图标显示在右下角的脚本代码
Mar 08 Python
用Python进行简单图像识别(验证码)
Jan 19 Python
python中datetime模块中strftime/strptime函数的使用
Jul 03 Python
Python/ArcPy遍历指定目录中的MDB文件方法
Oct 27 Python
Python多线程应用于自动化测试操作示例
Dec 06 Python
python基于Selenium的web自动化框架
Jul 14 Python
python实现翻转棋游戏(othello)
Jul 29 Python
python django model联合主键的例子
Aug 06 Python
Django 自定义分页器的实现代码
Nov 24 Python
opencv python在视屏上截图功能的实现
Mar 05 Python
python GUI库图形界面开发之PyQt5布局控件QVBoxLayout详细使用方法与实例
Mar 06 Python
pytorch简介
Nov 11 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
《DOTA3》开发工作已经开始 《DOTA3》将代替《DOTA2》
2021/03/06 DOTA
强烈推荐:php.ini中文版(2)
2006/10/09 PHP
php str_pad 函数使用详解
2009/01/13 PHP
php下将图片以二进制存入mysql数据库中并显示的实现代码
2010/05/27 PHP
php expects parameter 1 to be resource, array given 错误
2011/03/23 PHP
php 目录与文件处理-郑阿奇(续)
2011/07/04 PHP
深入解析Session是否必须依赖Cookie
2013/08/02 PHP
php函数指定默认值方法的小例子
2013/12/04 PHP
php基于数组函数实现关联表的编辑操作示例
2017/07/04 PHP
对YUI扩展的Gird组件 Part-1
2007/03/10 Javascript
Mootools 1.2教程 选项卡效果(Tabs)
2009/09/15 Javascript
JavaScript中通过闭包解决只能取得包含函数中任何变量最后一个值的问题
2010/08/12 Javascript
js修改input的type属性问题探讨
2013/10/12 Javascript
javascript的propertyIsEnumerable()方法使用介绍
2014/04/09 Javascript
解决ueditor jquery javascript 取值问题
2014/12/30 Javascript
深入理解jQuery之防止冒泡事件
2016/05/24 Javascript
js实现水平滚动菜单导航
2017/07/21 Javascript
浅谈node中的cluster集群
2018/06/02 Javascript
Node错误处理笔记之挖坑系列教程
2018/06/05 Javascript
基于layui数据表格以及传数据的方式
2018/08/19 Javascript
原生JS实现的放大镜特效示例【测试可用】
2018/12/08 Javascript
JQuery animate动画应用示例
2019/05/14 jQuery
javascript(基于jQuery)实现鼠标获取选中的文字示例【测试可用】
2019/10/26 jQuery
Python实现查找系统盘中需要找的字符
2015/07/14 Python
分享6个隐藏的python功能
2017/12/07 Python
Django重装mysql后启动报错:No module named ‘MySQLdb’的解决方法
2018/04/22 Python
python二维列表一维列表的互相转换实例
2018/07/02 Python
python爬虫爬取监控教务系统的思路详解
2020/01/08 Python
python数字类型math库原理解析
2020/03/02 Python
Python爬虫过程解析之多线程获取小米应用商店数据
2020/11/14 Python
ANINE BING官方网站:奢华的衣橱基本款和时尚永恒的单品
2019/11/26 全球购物
.net C#面试题
2012/08/28 面试题
食品行业求职人的自我评价
2014/01/19 职场文书
幼儿园实习生辞职信
2014/01/20 职场文书
创建精神文明单位实施方案
2014/03/08 职场文书
班主任先进事迹材料
2014/12/17 职场文书