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 21 Python
详解Python中where()函数的用法
Mar 27 Python
Python基于win32ui模块创建弹出式菜单示例
May 09 Python
详解Django中间件执行顺序
Jul 16 Python
Python中logging.NullHandler 的使用教程
Nov 29 Python
Python实现的排列组合、破解密码算法示例
Apr 12 Python
解决pycharm remote deployment 配置的问题
Jun 27 Python
Python实现二叉树的最小深度的两种方法
Sep 30 Python
Pytorch 实现权重初始化
Dec 31 Python
Python中remove漏删和索引越界问题的解决
Mar 18 Python
Python多线程:主线程等待所有子线程结束代码
Apr 25 Python
基于PyTorch中view的用法说明
Mar 03 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数组一对一替换实现代码
2012/08/31 PHP
php读取der格式证书乱码解决方法
2015/06/22 PHP
PHP实现财务审核通过后返现金额到客户的功能
2019/07/04 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
2019/12/20 PHP
js实现的仿新浪微博完美的时间组件升级版
2011/12/20 Javascript
javascript匿名函数应用示例介绍
2014/03/07 Javascript
浏览器缩放检测的js代码
2014/09/28 Javascript
javascript控制台详解
2015/06/25 Javascript
bootstrap IE8 兼容性处理
2017/03/22 Javascript
AngularJS中controller控制器继承的使用方法
2017/11/03 Javascript
结合mint-ui移动端下拉加载实践方法总结
2017/11/08 Javascript
详解JS取出两个数组中的不同或相同元素
2019/03/20 Javascript
JS如何生成动态列表
2020/09/22 Javascript
详解ES6 中的Object.assign()的用法实例代码
2021/01/11 Javascript
关于Python数据结构中字典的心得
2017/12/04 Python
为什么Python中没有"a++"这种写法
2018/11/27 Python
Python二叉树的遍历操作示例【前序遍历,中序遍历,后序遍历,层序遍历】
2018/12/24 Python
Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
2019/08/05 Python
解决Django连接db遇到的问题
2019/08/29 Python
Python彻底删除文件夹及其子文件方式
2019/12/23 Python
检测tensorflow是否使用gpu进行计算的方式
2020/02/03 Python
Mio Skincare美国官网:身体紧致及孕期身体护理
2017/03/05 全球购物
简单说说tomcat的配置
2013/05/28 面试题
编码转换,怎样实现将GB2312编码的字符串转换为ISO-8859-1编码的字符串
2014/01/07 面试题
Java基础知识面试要点
2016/07/29 面试题
什么是makefile? 如何编写makefile?
2013/01/02 面试题
一个J2EE项目团队的主要人员组成是什么
2012/06/04 面试题
年会搞笑主持词
2014/03/27 职场文书
九一八事变演讲稿
2014/09/05 职场文书
2015国庆节66周年演讲稿
2015/03/20 职场文书
身份证丢失证明
2015/06/19 职场文书
物业管理交接协议书
2016/03/24 职场文书
2019年工作总结范文
2019/05/21 职场文书
导游词之江南周庄
2019/12/06 职场文书
《悲惨世界》:比天空更广阔的是人的心灵
2020/01/16 职场文书
Vue.js中v-bind指令的用法介绍
2022/03/13 Vue.js