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和shell变量互相传递的几种方法
Nov 20 Python
Python中的对象,方法,类,实例,函数用法分析
Jan 15 Python
在Python中处理字符串之isdecimal()方法的使用
May 20 Python
python3中int(整型)的使用教程
Mar 23 Python
详解python数据结构和算法
Apr 18 Python
用uWSGI和Nginx部署Flask项目的方法示例
May 05 Python
Python3匿名函数lambda介绍与使用示例
May 18 Python
pycharm编写spark程序,导入pyspark包的3中实现方法
Aug 02 Python
Python中bisect的使用方法
Dec 31 Python
Python利用Scrapy框架爬取豆瓣电影示例
Jan 17 Python
解决python多线程报错:AttributeError: Can't pickle local object问题
Apr 08 Python
整理Python中常用的conda命令操作
Jun 15 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
codeigniter中view通过循环显示数组数据的方法
2015/03/20 PHP
PHP生成各种常见验证码和Ajax验证过程
2016/01/10 PHP
如何做到打开一个页面,过几分钟自动转到另一页面
2007/04/20 Javascript
JavaScript 计算当天是本年本月的第几周
2009/03/22 Javascript
离开页面时检测表单元素是否被修改,提示保存的js代码
2010/08/25 Javascript
cument.execCommand()用法深入理解
2012/12/04 Javascript
Node.js中HTTP模块与事件模块详解
2014/11/14 Javascript
jquery实现可点击伸缩与展开的菜单效果代码
2015/08/31 Javascript
如何快速上手Vuex
2017/02/14 Javascript
COM组件中调用JavaScript函数详解及实例
2017/02/23 Javascript
Vue分页组件实例代码
2017/04/17 Javascript
jQuery实现的弹幕效果完整实例
2017/09/06 jQuery
angularjs实现的购物金额计算工具示例
2018/05/08 Javascript
深入理解JavaScript的值传递和引用传递
2018/10/24 Javascript
Vue 样式绑定的实现方法
2019/01/15 Javascript
Node.js系列之连接DB的方法(3)
2019/08/30 Javascript
React-redux实现小案例(todolist)的过程
2019/09/29 Javascript
layui前端时间戳转化实例
2019/11/15 Javascript
微信小程序如何获取地址
2019/12/24 Javascript
JS数据类型分类及常用判断方法
2020/11/19 Javascript
vuex页面刷新导致数据丢失的解决方案
2020/12/10 Vue.js
uniapp微信小程序:key失效的解决方法
2021/01/20 Javascript
python网络编程学习笔记(四):域名系统
2014/06/09 Python
Python中函数参数匹配模型详解
2019/06/09 Python
在python plt图表中文字大小调节的方法
2019/07/08 Python
浅析PEP570新语法: 只接受位置参数
2019/10/15 Python
python将图片转base64,实现前端显示
2020/01/09 Python
tensorflow 限制显存大小的实现
2020/02/03 Python
运行tensorflow python程序,限制对GPU和CPU的占用操作
2020/02/06 Python
HTML5使用Audio标签实现歌词同步的效果
2016/03/17 HTML / CSS
英国家喻户晓的折扣商场:TK Maxx
2017/05/26 全球购物
中文师范生自荐信
2014/01/30 职场文书
网络技术专业求职信
2014/05/02 职场文书
井冈山红色之旅感想
2014/10/07 职场文书
虎兄虎弟观后感
2015/06/12 职场文书
Python如何将list中的string转换为int
2022/07/15 Ruby