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 解析XML python模块xml.dom解析xml实例代码
Feb 07 Python
使用python解析xml成对应的html示例分享
Apr 02 Python
python3读取csv和xlsx文件的实例
Jun 22 Python
Python实现朴素贝叶斯分类器的方法详解
Jul 04 Python
Flask框架响应、调度方法和蓝图操作实例分析
Jul 24 Python
python 实现读取一个excel多个sheet表并合并的方法
Feb 12 Python
Django框架首页和登录页分离操作示例
May 28 Python
Python通过Pillow实现图片对比
Apr 29 Python
python基于socket函数实现端口扫描
May 28 Python
opencv 实现特定颜色线条提取与定位操作
Jun 02 Python
学会迭代器设计模式,帮你大幅提升python性能
Jan 03 Python
python向xls写入数据(包括合并,边框,对齐,列宽)
Feb 02 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 文件上传后缀名与文件类型对照表(几乎涵盖所有文件)
2010/05/16 PHP
php学习之 数组声明
2011/06/09 PHP
详解PHP中websocket的使用方法
2016/09/15 PHP
深入解析PHP中SESSION反序列化机制
2017/03/01 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
8个超棒的学习 jQuery 的网站 推荐收藏
2011/04/02 Javascript
jQuery+CSS 半开折叠效果原理及代码(自写)
2013/03/04 Javascript
jqeury-easyui-layout问题解决方法
2014/03/24 Javascript
AngularJS模块管理问题的非常规处理方法
2015/04/29 Javascript
jQuery实现仿新浪微博浮动的消息提示框(可智能定位)
2015/10/10 Javascript
Bootstrap每天必学之警告框插件
2016/04/26 Javascript
AngularJS 基础ng-class-even指令用法
2016/08/01 Javascript
JS闭包与延迟求值用法示例
2016/12/22 Javascript
微信小程序 参数传递实例代码
2017/03/20 Javascript
利用Node.js了解与测量HTTP所花费的时间详解
2017/09/22 Javascript
JavaScript实现左侧菜单效果
2017/12/14 Javascript
vue 子组件向父组件传值方法
2018/02/26 Javascript
Web安全之XSS攻击与防御小结
2018/12/13 Javascript
微信小程序如何获取群聊的openGid以及名称详解
2019/07/17 Javascript
python获取元素在数组中索引号的方法
2015/07/15 Python
python遍历文件夹,指定遍历深度与忽略目录的方法
2018/07/11 Python
Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例
2018/07/27 Python
对python打乱数据集中X,y标签对的方法详解
2018/12/14 Python
Python3将数据保存为txt文件的方法
2019/09/12 Python
Python PIL库图片灰化处理
2020/04/07 Python
Python爬虫破解登陆哔哩哔哩的方法
2020/11/17 Python
C,C++的几个面试题小集
2013/07/13 面试题
医学院校毕业生自荐信范文
2014/01/01 职场文书
医院学雷锋活动策划方案
2014/02/15 职场文书
服务型党组织建设典型材料
2014/05/07 职场文书
本科毕业生自荐信
2014/05/26 职场文书
老干部工作汇报材料
2014/10/28 职场文书
毕业设计致谢语
2015/05/14 职场文书
少先队大队委竞选口号
2015/12/25 职场文书
2019商业计划书格式、范文
2019/04/24 职场文书
关于vue-router-link选择样式设置
2022/04/30 Vue.js