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生成随机密码的示例分享
Feb 18 Python
Python程序运行原理图文解析
Feb 10 Python
利用python实现对web服务器的目录探测的方法
Feb 26 Python
基于python实现蓝牙通信代码实例
Nov 19 Python
解决pytorch-yolov3 train 报错的问题
Feb 18 Python
TensorFlow2.1.0安装过程中setuptools、wrapt等相关错误指南
Apr 08 Python
python实现处理mysql结果输出方式
Apr 09 Python
python对接ihuyi实现短信验证码发送
May 10 Python
Python基于httpx模块实现发送请求
Jul 07 Python
python调用摄像头的示例代码
Sep 28 Python
还在手动盖楼抽奖?教你用Python实现自动评论盖楼抽奖(一)
Jun 07 Python
解决pycharm下载库时出现Failed to install package的问题
Sep 04 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中addslashes与mysql_escape_string的区别分析
2016/04/25 PHP
thinkPHP模板中for循环与switch语句用法示例
2016/11/30 PHP
Javascript 面向对象 重载
2010/05/13 Javascript
滚动图片效果 jquery实现回旋滚动效果
2013/01/08 Javascript
JS Replace()的高级使用方法介绍
2013/06/29 Javascript
深入理解JavaScript中的传值与传引用
2013/12/09 Javascript
javascript html5摇一摇功能的实现
2016/04/19 Javascript
只需五句话搞定JavaScript作用域(经典)
2016/07/26 Javascript
分享JS代码实现鼠标放在输入框上输入框和图片同时更换样式
2016/09/01 Javascript
js代码实现下拉菜单【推荐】
2016/12/15 Javascript
jQuery密码强度验证控件使用详解
2017/01/05 Javascript
Bootstrap布局之栅格系统学习笔记
2017/05/04 Javascript
原生JS实现简单的倒计时功能示例
2018/08/30 Javascript
JavaScript数据结构与算法之二叉树插入节点、生成二叉树示例
2019/02/21 Javascript
js canvas实现5张图片合成一张图片
2019/07/15 Javascript
vue addRoutes路由动态加载操作
2020/08/04 Javascript
使用GitHub和Python实现持续部署的方法
2019/05/09 Python
Python中函数的基本定义与调用及内置函数详解
2019/05/13 Python
python实现翻转棋游戏(othello)
2019/07/29 Python
wxPython+Matplotlib绘制折线图表
2019/11/19 Python
python3光学字符识别模块tesserocr与pytesseract的使用详解
2020/02/26 Python
Python实现AI自动抠图实例解析
2020/03/05 Python
详解python中的lambda与sorted函数
2020/09/04 Python
麦当劳辞职信范文
2014/01/18 职场文书
七年级音乐教学反思
2014/01/26 职场文书
标准自荐信范文
2014/01/29 职场文书
师德模范事迹材料
2014/06/03 职场文书
七年级地理教学计划
2015/01/22 职场文书
会议欢迎词范文
2015/01/27 职场文书
本溪水洞导游词
2015/02/11 职场文书
百万英镑观后感
2015/06/09 职场文书
HTML+CSS+JS实现图片的瀑布流布局的示例代码
2021/04/22 HTML / CSS
Python中Cookies导出某站用户数据的方法
2021/05/17 Python
Anaconda配置各版本Pytorch的实现
2021/08/07 Python
我家女友可不止可爱呢 公开OP主题曲无字幕动画MV
2022/04/11 日漫
java高级用法JNA强大的Memory和Pointer
2022/04/19 Java/Android