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实现从网络下载文件并获得文件大小及类型的方法
Apr 28 Python
Python中title()方法的使用简介
May 20 Python
Python栈算法的实现与简单应用示例
Nov 01 Python
Python多进程库multiprocessing中进程池Pool类的使用详解
Nov 24 Python
TensorFlow 滑动平均的示例代码
Jun 19 Python
Python获取时间戳代码实例
Sep 24 Python
Python使用grequests(gevent+requests)并发发送请求过程解析
Sep 25 Python
Python上下文管理器全实例详解
Nov 12 Python
如何通过命令行进入python
Jul 06 Python
python3中calendar返回某一时间点实例讲解
Nov 18 Python
Python函数调用追踪实现代码
Nov 27 Python
python实现图片九宫格分割的示例
Apr 25 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求两个目录的相对路径示例(php获取相对路径)
2014/03/27 PHP
Smarty局部缓存的几种方法简介
2014/06/17 PHP
php程序内部post数据的方法
2015/03/31 PHP
php上传图片获取路径及给表单字段赋值的方法
2016/01/23 PHP
Avengerls vs Newbee BO3 第二场2.18
2021/03/10 DOTA
Javascript中找到子元素在父元素内相对位置的代码
2012/07/21 Javascript
js Dialog 实践分享
2012/10/22 Javascript
jQuery 遍历-nextUntil()方法以及prevUntil()方法的使用介绍
2013/04/26 Javascript
JavaScript实现点击按钮后变灰避免多次重复提交
2013/07/15 Javascript
js 事件截取enter按键页面提交事件示例代码
2014/03/04 Javascript
javascript去除字符串中所有标点符号和提取纯文本的正则
2014/06/07 Javascript
vue引入swiper插件的使用实例
2017/07/19 Javascript
详解Vue 全局引入bass.scss 处理方案
2018/03/26 Javascript
React.js组件实现拖拽排序组件功能过程解析
2020/04/27 Javascript
Python按行读取文件的实现方法【小文件和大文件读取】
2016/09/19 Python
Python算法应用实战之栈详解
2017/02/04 Python
windows 10下安装搭建django1.10.3和Apache2.4的方法
2017/04/05 Python
Python切片工具pillow用法示例
2018/03/30 Python
pycharm下查看python的变量类型和变量内容的方法
2018/06/26 Python
Python3.5装饰器典型案例分析
2019/04/30 Python
Python变量访问权限控制详解
2019/06/29 Python
通过字符串导入 Python 模块的方法详解
2019/10/27 Python
在 Pycharm 安装使用black的方法详解
2020/04/02 Python
windows python3安装Jupyter Notebooks教程
2020/04/13 Python
Omio意大利:全欧洲低价大巴、火车和航班搜索和比价
2017/12/02 全球购物
技术总监岗位职责
2013/12/05 职场文书
致跳远运动员加油稿
2014/02/11 职场文书
合法的离婚协议书范本
2014/10/23 职场文书
党的群众路线教育实践活动心得体会(医院)
2014/11/03 职场文书
2015年六一儿童节演讲稿
2015/03/19 职场文书
孟佩杰观后感
2015/06/17 职场文书
钢铁是怎样炼成的读书笔记
2015/06/29 职场文书
2016年暑期教师培训心得体会
2016/01/09 职场文书
python3.7.2 tkinter entry框限定输入数字的操作
2021/05/22 Python
解决Pytorch半精度浮点型网络训练的问题
2021/05/24 Python
教你怎么用Python selenium操作浏览器对象的基础API
2021/06/23 Python