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兔子毒药问题实例分析
Mar 05 Python
Python中实现结构相似的函数调用方法
Mar 10 Python
Pythont特殊语法filter,map,reduce,apply使用方法
Feb 27 Python
Python设计模式编程中Adapter适配器模式的使用实例
Mar 02 Python
python django框架中使用FastDFS分布式文件系统的安装方法
Jun 10 Python
Python中请不要再用re.compile了
Jun 30 Python
flask框架配置mysql数据库操作详解
Nov 29 Python
在flask中使用python-dotenv+flask-cli自定义命令(推荐)
Jan 05 Python
python如何通过twisted搭建socket服务
Feb 03 Python
Python3实现飞机大战游戏
Apr 24 Python
pytorch 中autograd.grad()函数的用法说明
May 12 Python
python调用ffmpeg命令行工具便捷操作视频示例实现过程
Nov 01 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
从C/C++迁移到PHP——判断字符类型的函数
2006/10/09 PHP
PHP实现图片压缩的两则实例
2014/07/19 PHP
PHP采集静态页面并把页面css,img,js保存的方法
2014/12/23 PHP
PHP调用接口API封装的例子
2019/10/11 PHP
php利用ZipArchive类操作文件的实例
2020/01/21 PHP
我的javascript 函数链之演变
2011/04/07 Javascript
JS链式调用的实现方法
2013/03/07 Javascript
js 获取class的元素的方法 以及创建方法getElementsByClassName
2013/03/11 Javascript
Google (Local) Search API的简单使用介绍
2013/11/28 Javascript
JSuggest自动匹配下拉框使用方法(示例代码)
2013/12/27 Javascript
javascript每日必学之条件分支
2016/02/17 Javascript
详解JavaScript的另类写法
2016/04/11 Javascript
JS实现移动端整屏滑动的实例代码
2017/11/10 Javascript
javascript前端和后台进行数据交互方法示例
2020/08/07 Javascript
[02:49]DAC2018决赛日TOP5 LGD开启黑暗之门绝杀VP
2018/04/08 DOTA
python远程调用rpc模块xmlrpclib的方法
2019/01/11 Python
在Pycharm中自动添加时间日期作者等信息的方法
2019/01/16 Python
python和c语言的主要区别总结
2019/07/07 Python
PyCharm专业最新版2019.1安装步骤(含激活码)
2019/10/09 Python
Python3.6安装卸载、执行命令、执行py文件的方法详解
2020/02/20 Python
Django中Aggregation聚合的基本使用方法
2020/07/09 Python
详解Python3 定义一个跨越多行的字符串的多种方法
2020/09/06 Python
Nike西班牙官方网站:Nike.com (ES)
2017/10/30 全球购物
联想加拿大官方网站:Lenovo Canada
2018/04/05 全球购物
美国最大的半成品净菜电商:Blue Apron(蓝围裙)
2018/04/27 全球购物
Surfdome西班牙:世界上最受欢迎的生活方式品牌
2019/02/13 全球购物
美国名牌手表折扣网站:Jomashop
2020/05/22 全球购物
泰国第一在线超市:Tops
2021/02/13 全球购物
小学运动会表扬稿
2014/01/19 职场文书
中学生获奖感言
2014/02/04 职场文书
初中学校军训方案
2014/05/09 职场文书
爱心捐书活动总结
2014/07/05 职场文书
社区党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
公司授权委托书
2014/10/17 职场文书
总经理2015中秋节致辞
2015/07/29 职场文书
导游词之晋城蟒河
2019/12/12 职场文书