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写的Discuz7.2版faq.php注入漏洞工具
Aug 06 Python
python类继承用法实例分析
Oct 10 Python
Python基于动态规划算法计算单词距离
Jul 25 Python
python中将字典形式的数据循环插入Excel
Jan 16 Python
用Python3创建httpServer的简单方法
Jun 04 Python
Python 给屏幕打印信息加上颜色的实现方法
Apr 24 Python
python的set处理二维数组转一维数组的方法示例
May 31 Python
python 中值滤波,椒盐去噪,图片增强实例
Dec 18 Python
解决python 找不到module的问题
Feb 12 Python
django form和field具体方法和属性说明
Jul 09 Python
关于Python3爬虫利器Appium的安装步骤
Jul 29 Python
Python代码覆盖率统计工具coverage.py用法详解
Nov 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
什么是短波收听SWL
2021/03/01 无线电
PHP4实际应用经验篇(9)
2006/10/09 PHP
PHP实现自动识别Restful API的返回内容类型
2015/02/07 PHP
配置eAccelerator和XCache扩展来加速PHP程序的执行
2015/12/22 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
浅析php如何实现爬取数据原理
2018/09/27 PHP
用Javascript 获取页面元素的位置的代码
2009/09/25 Javascript
JavaScript去掉空格的方法集合
2010/12/28 Javascript
JavaScript操作XML文件之XML读取方法
2015/06/09 Javascript
JS实现状态栏跑马灯文字效果代码
2015/10/24 Javascript
基于JavaScript短信验证码如何实现
2016/01/24 Javascript
angularjs表格ng-table使用备忘录
2016/03/09 Javascript
AngularJs bootstrap搭载前台框架——准备工作
2016/09/01 Javascript
jquery.Callbacks的实现详解
2016/11/30 Javascript
jquery获取input type=text中的值的各种方式(总结)
2016/12/02 Javascript
JavaScript实现星级评价效果
2019/05/17 Javascript
Vue中this.$nextTick的作用及用法
2020/02/04 Javascript
js点击事件的执行过程实例分析【冒泡与捕获】
2020/04/11 Javascript
基于JS实现操作成功之后自动跳转页面
2020/09/25 Javascript
[01:05:24]Ti4 冒泡赛第二天 iG vs NEWBEE 3
2014/07/15 DOTA
[01:08]DOTA2“血战之命”预告片
2017/08/12 DOTA
[36:45]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
通过代码实例展示Python中列表生成式的用法
2015/03/31 Python
Python编程入门的一些基本知识
2015/05/13 Python
python实现机械分词之逆向最大匹配算法代码示例
2017/12/13 Python
Python面向对象之静态属性、类方法与静态方法分析
2018/08/24 Python
pyqt5 实现在别的窗口弹出进度条
2019/06/18 Python
Python秒算24点实现及原理详解
2019/07/29 Python
css3利用transform变形结合事件完成扇形导航
2020/10/26 HTML / CSS
ORACLE第二个十问
2013/12/14 面试题
高职教师岗位职责
2013/12/24 职场文书
感恩寄语大全
2014/04/11 职场文书
未受刑事制裁公证证明
2014/09/20 职场文书
公安机关党的群众路线教育实践活动剖析材料
2014/10/10 职场文书
简单了解 MySQL 中相关的锁
2021/05/25 MySQL
centos8安装nginx1.9.1的详细过程
2021/08/02 Servers