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读文件逐行处理的示例代码分享
Dec 27 Python
用实例详解Python中的Django框架中prefetch_related()函数对数据库查询的优化
Apr 01 Python
Python批量转换文件编码格式
May 17 Python
举例讲解Python中的身份运算符的使用方法
Oct 13 Python
Python3.4实现远程控制电脑开关机
Feb 22 Python
numpy中实现ndarray数组返回符合特定条件的索引方法
Apr 17 Python
对Python信号处理模块signal详解
Jan 09 Python
解决Python plt.savefig 保存图片时一片空白的问题
Jan 10 Python
通过Turtle库在Python中绘制一个鼠年福鼠
Feb 03 Python
PyQt5实现画布小程序
May 30 Python
Python+Opencv身份证号码区域提取及识别实现
Aug 25 Python
java关于string最常出现的面试题整理
Jan 18 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
第1次亲密接触PHP5(1)
2006/10/09 PHP
PHP 字符串操作入门教程
2006/12/06 PHP
PHP字符编码问题之GB2312 VS UTF-8解决方法
2011/06/23 PHP
谨慎使用PHP的引用原因分析
2012/09/06 PHP
php读取csv文件后,uft8 bom导致在页面上显示出现问题的解决方法
2013/08/10 PHP
php eval函数一句话木马代码
2015/05/21 PHP
ThinkPHP中数据操作案例分析
2015/09/27 PHP
PHP人民币金额转大写实例代码
2015/10/02 PHP
jQuery表单验证插件formValidator(改进版)
2012/02/03 Javascript
基于jQuery捕获超链接事件进行局部刷新代码
2012/05/10 Javascript
jQuery中insertAfter()方法用法实例
2015/01/08 Javascript
JavaScript实现列表分页功能特效
2015/05/15 Javascript
完美实现bootstrap分页查询
2015/12/09 Javascript
学习javascript面向对象 理解javascript原型和原型链
2016/01/04 Javascript
JS中作用域和变量提升(hoisting)的深入理解
2016/10/31 Javascript
Ajax的概述与实现过程
2016/11/18 Javascript
JS自定义滚动条效果简单实现代码
2020/10/27 Javascript
使用localStorage替代cookie做本地存储
2019/09/25 Javascript
js获取url页面id,也就是最后的数字文件名
2020/09/25 Javascript
Python程序设计入门(3)数组的使用
2014/06/16 Python
Python实现字典的key和values的交换
2015/08/04 Python
对python 匹配字符串开头和结尾的方法详解
2018/10/27 Python
Scrapy-Redis结合POST请求获取数据的方法示例
2019/05/07 Python
详解python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'如何解决
2019/08/27 Python
Python连接Hadoop数据中遇到的各种坑(汇总)
2020/04/14 Python
html5 canvas-1.canvas介绍(hello canvas)
2013/01/07 HTML / CSS
DJI大疆无人机官方商城:全球领先的无人飞行器研发和生产商
2016/12/21 全球购物
Levi’s西班牙官方网站:李维斯,著名的牛仔裤品牌
2020/08/20 全球购物
工地门卫岗位职责
2013/12/30 职场文书
机械个人求职信范文
2014/01/24 职场文书
企业员工薪酬方案
2014/06/04 职场文书
学校教研活动总结
2014/07/02 职场文书
2015年乡镇民政工作总结
2015/05/13 职场文书
学习雷锋主题班会
2015/08/14 职场文书
导游词之香港-太平山顶
2019/10/18 职场文书
Nginx如何获取自定义请求header头和URL参数详解
2022/07/23 Servers