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实现将汉字转换成汉语拼音的库
May 05 Python
python发送HTTP请求的方法小结
Jul 08 Python
Python处理文本文件中控制字符的方法
Feb 07 Python
初学python的操作难点总结(新手必看篇)
Aug 03 Python
python使用多进程的实例详解
Sep 19 Python
Python动态语言与鸭子类型详解
Jul 01 Python
Pytorch 多块GPU的使用详解
Dec 31 Python
Tensorflow 多线程与多进程数据加载实例
Feb 05 Python
Python如何实现小程序 无限求和平均
Feb 18 Python
python 解决print数组/矩阵无法完整输出的问题
Feb 19 Python
Python处理mysql特殊字符的问题
Mar 02 Python
用opencv给图片换背景色的示例代码
Jul 08 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
《魔兽争霸3:重制版》更新 多项视觉效果调整
2020/05/04 魔兽争霸
Laravel中9个不经常用的小技巧汇总
2019/04/16 PHP
js 表格隔行颜色
2009/12/02 Javascript
Js切换功能的简单方法
2010/11/23 Javascript
JavaScript中函数声明优先于变量声明的实例分析
2012/03/01 Javascript
javascript弹出层输入框(示例代码)
2013/12/11 Javascript
javascript正则匹配汉字、数字、字母、下划线
2014/04/10 Javascript
js实现点击图片改变页面背景图的方法
2015/02/28 Javascript
jQuery实现360°全景拖动展示
2015/03/18 Javascript
js结合正则实现国内手机号段校验
2015/06/19 Javascript
AngularJS入门教程之MVC架构实例分析
2016/11/01 Javascript
jquery replace方法去空格
2017/05/08 jQuery
vue.js的安装方法
2017/05/12 Javascript
vue中实现图片和文件上传的示例代码
2018/03/16 Javascript
微信小程序实时聊天WebSocket
2018/07/05 Javascript
解决layui 复选框等内置控件不显示的问题
2018/08/14 Javascript
JavaScript实现连连看连线算法
2019/01/05 Javascript
使用webpack搭建vue项目及注意事项
2019/06/10 Javascript
超详细的5个Shell脚本实例分享(值得收藏)
2019/08/15 Javascript
Python入门篇之字符串
2014/10/17 Python
python避免死锁方法实例分析
2015/06/04 Python
Android分包MultiDex策略详解
2017/10/30 Python
python 遍历目录(包括子目录)下所有文件的实例
2018/07/11 Python
python中比较两个列表的实例方法
2019/07/04 Python
Django日志及中间件模块应用案例
2020/09/10 Python
canvas实现俄罗斯方块的方法示例
2018/12/13 HTML / CSS
英国剑桥包官网:The Cambridge Satchel Company
2016/08/01 全球购物
德国内衣、泳装和睡衣网上商店:Bigsize Dessous
2018/07/09 全球购物
苏格兰在线威士忌商店:The Whisky Barrel
2019/05/07 全球购物
感恩母亲节活动方案
2014/03/04 职场文书
总经理秘书岗位职责
2014/03/17 职场文书
精彩的广告词
2014/03/19 职场文书
文秘求职信范文
2014/04/10 职场文书
建筑投标担保书
2014/05/20 职场文书
2014年药店工作总结
2014/11/20 职场文书
2015年度党员个人总结
2015/02/14 职场文书