python实现可变变量名方法详解


Posted in Python onJuly 01, 2019

如果要写一个程序,让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 动态获取变量的变量名

需求目标:如果有了上面的动态命名list,那么当动态获取变量的变量名,就需要如下的操作:

利用python原生的inspect库来实现:

核心代码:

import inspect
def get_variable_name(variable):
  callers_local_vars = inspect.currentframe().f_back.f_locals.items()
  return [var_name for var_name, var_val in callers_local_vars if var_val is variable]

测试代码:

def get_variable_name(variable):
  callers_local_vars = inspect.currentframe().f_back.f_locals.items()
  return [var_name for var_name, var_val in callers_local_vars if var_val is variable]


if __name__ == '__main__':
  prepare_list = locals()
  for i in range(16):
    prepare_list['list_' + str(i)] = []
    prepare_list['list_' + str(i)].append(('我是第' + str(i)) + '个list')
  a = get_variable_name(prepare_list['list_0']).pop()
  b = get_variable_name(prepare_list['list_1']).pop()
  print(a)
  print(b)
Python 相关文章推荐
Python注释详解
Jun 01 Python
简单谈谈Python中的闭包
Nov 30 Python
django中send_mail功能实现详解
Feb 06 Python
python实现超市扫码仪计费
May 30 Python
Python语言检测模块langid和langdetect的使用实例
Feb 19 Python
Python数据结构与算法(几种排序)小结
Jun 22 Python
Python搭建Spark分布式集群环境
Jul 05 Python
如何使用django的MTV开发模式返回一个网页
Jul 22 Python
Python3显示当前时间、计算时间差及时间加减法示例代码
Sep 07 Python
pygame实现俄罗斯方块游戏(基础篇3)
Oct 29 Python
python实现在线翻译功能
Mar 03 Python
基于PyQT实现区分左键双击和单击
May 19 Python
12个步骤教你理解Python装饰器
Jul 01 #Python
详解利用python+opencv识别图片中的圆形(霍夫变换)
Jul 01 #Python
在python里面运用多继承方法详解
Jul 01 #Python
详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)
Jul 01 #Python
用python打印1~20的整数实例讲解
Jul 01 #Python
python sklearn库实现简单逻辑回归的实例代码
Jul 01 #Python
python实现列表的排序方法分享
Jul 01 #Python
You might like
极典R601SW收音机
2021/03/02 无线电
php实现斐波那契数列的简单写法
2014/07/19 PHP
PHP中配置IIS7实现基本身份验证的方法
2015/09/24 PHP
jQuery 扩展对input的一些操作方法
2009/10/30 Javascript
JS实现图片翻书效果示例代码
2013/09/09 Javascript
JavaScript DOM 编程艺术(第2版)读书笔记(JavaScript的最佳实践)
2013/10/01 Javascript
中文输入法不触发onkeyup事件的解决办法
2014/07/09 Javascript
js实现点击链接后窗口缩小并居中的方法
2015/03/02 Javascript
JS+CSS实现下拉列表框美化效果(3款)
2015/08/15 Javascript
基于jQuery倾斜打开侧边栏菜单特效代码
2015/09/15 Javascript
详解JavaScript中的Unescape()和String() 函数
2015/11/09 Javascript
学习javascript面向对象 理解javascript对象
2016/01/04 Javascript
javascript加载xml 并解析各节点的值(实现方法)
2016/10/12 Javascript
简单实现Bootstrap标签页
2020/08/09 Javascript
jQuery动态生成表格及右键菜单功能示例
2017/01/13 Javascript
简单谈谈关于 npm 5.0 的新坑
2017/06/08 Javascript
浅谈 Vue v-model指令的实现原理
2017/06/08 Javascript
Angular中封装fancyBox(图片预览)遇到问题小结
2017/09/01 Javascript
jQuery实现table中两列CheckBox只能选中一个的示例
2017/09/22 jQuery
ReactNative之FlatList的具体使用方法
2017/11/29 Javascript
React.js组件实现拖拽排序组件功能过程解析
2020/04/27 Javascript
适用于 Vue 的播放器组件Vue-Video-Player操作
2020/11/16 Javascript
[04:30]显微镜下的DOTA2第五期——拉比克
2013/09/26 DOTA
python根据文件大小打log日志
2014/10/09 Python
Python正则表达式非贪婪、多行匹配功能示例
2017/08/08 Python
python中查看.db文件中表格的名字及表格中的字段操作
2020/07/07 Python
Python解析微信dat文件的方法
2020/11/30 Python
详解pandas apply 并行处理的几种方法
2021/02/24 Python
HTML5时代CSS设置漂亮字体取代图片
2014/09/04 HTML / CSS
不同浏览器创建XMLHttpRequest方法有什么不同
2014/11/17 面试题
优秀求职信范文分享
2014/01/26 职场文书
团拜会策划方案
2014/06/07 职场文书
摩登时代观后感
2015/06/03 职场文书
CSS3点击按钮圆形进度打钩效果的实现代码
2021/03/30 HTML / CSS
ObjectMapper 如何忽略字段大小写
2021/06/29 Java/Android
IDEA2021.2配置docker如何将springboot项目打成镜像一键发布部署
2021/09/25 Java/Android