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 数据的清理行为实例详解
Jul 12 Python
解决csv.writer写入文件有多余的空行问题
Jul 06 Python
python复制列表时[:]和[::]之间有什么区别
Oct 16 Python
对Python 除法负数取商的取整方式详解
Dec 12 Python
python读csv文件时指定行为表头或无表头的方法
Jun 26 Python
使用Pyinstaller转换.py文件为.exe可执行程序过程详解
Aug 06 Python
python中dict()的高级用法实现
Nov 13 Python
python3通过udp实现组播数据的发送和接收操作
May 05 Python
如何在Win10系统使用Python3连接Hive
Oct 15 Python
Selenium 安装和简单使用的实现
Dec 04 Python
用Python进行栅格数据的分区统计和批量提取
May 27 Python
OpenCV 图像梯度的实现方法
Jul 25 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
PHP 分页原理分析,大家可以看看
2009/12/21 PHP
PHP面向对象的进阶学习(抽像类、接口、final、类常量)
2012/05/07 PHP
php更新mysql后获取改变行数的方法
2014/12/25 PHP
PHP四种基本排序算法示例
2015/04/09 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
2017/11/13 PHP
jQuery技巧大放送 学习jquery的朋友可以看下
2009/10/14 Javascript
javascript setTimeout()传递函数参数(包括传递对象参数)
2010/04/07 Javascript
Javascript异步表单提交,图片上传,兼容异步模拟ajax技术
2010/05/10 Javascript
JavaScript移除数组内重复元素的方法
2015/03/18 Javascript
JS实现横向与竖向两个选项卡Tab联动的方法
2015/09/27 Javascript
Bootstrap入门书籍之(一)排版
2016/02/17 Javascript
jQuery 中的 DOM 操作
2016/04/26 Javascript
jQuery改变form表单的action,并进行提交的实现代码
2016/05/25 Javascript
完美的js图片轮换效果
2017/02/05 Javascript
jQuery UI Draggable + Sortable 结合使用(实例讲解)
2017/09/07 jQuery
在Vue项目中引入JQuery-ui插件的讲解
2019/01/27 jQuery
JS使用iView的Dropdown实现一个右键菜单
2019/05/06 Javascript
jsonp格式前端发送和后台接受写法的代码详解
2019/11/07 Javascript
js构造函数constructor和原型prototype原理与用法实例分析
2020/03/02 Javascript
Python中的面向对象编程详解(上)
2015/04/13 Python
Python中zfill()方法的使用教程
2015/05/20 Python
python实现字典(dict)和字符串(string)的相互转换方法
2017/03/01 Python
通过python将大量文件按修改时间分类的方法
2018/10/17 Python
计算机二级python学习教程(2) python语言基本语法元素
2019/05/16 Python
python 杀死自身进程的实现方法
2019/07/01 Python
python自动结束mysql慢查询会话的实例代码
2019/10/27 Python
python如何提升爬虫效率
2020/09/27 Python
Vivo俄罗斯官方在线商店:中国智能手机品牌
2019/10/04 全球购物
英国拖鞋购买网站:Bedroom Athletics
2020/02/28 全球购物
生日派对邀请函
2014/01/13 职场文书
《草虫的村落》教学反思
2014/02/16 职场文书
优秀的2014年两会精神解读
2014/03/17 职场文书
机关作风建设整改方案
2014/10/27 职场文书
党员剖析材料范文
2014/12/18 职场文书
2015年化妆品销售工作总结
2015/05/11 职场文书
详解Apache SkyWalking 告警配置指南
2021/04/22 Servers