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实现清屏的方法
Apr 30 Python
使用Python编写简单的画图板程序的示例教程
Dec 08 Python
Pycharm无法显示动态图片的解决方法
Oct 28 Python
python实现祝福弹窗效果
Apr 07 Python
django 使用 PIL 压缩图片的例子
Aug 16 Python
python中open函数的基本用法示例
Sep 07 Python
Selenium启动Chrome时配置选项详解
Mar 18 Python
用python给csv里的数据排序的具体代码
Jul 17 Python
用Python进行websocket接口测试
Oct 16 Python
Python爬虫之Selenium实现窗口截图
Dec 04 Python
利用python Pandas实现批量拆分Excel与合并Excel
May 23 Python
详解Python为什么不用设计模式
Jun 24 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 mysql与mysqli事务使用说明 分享
2013/08/17 PHP
YII框架中使用memcache的方法详解
2017/08/02 PHP
js获取url中的参数且参数为中文时通过js解码
2014/03/19 Javascript
jQuery中triggerHandler()方法用法实例
2015/01/19 Javascript
javascript实现画不相交的圆
2015/04/07 Javascript
jQuery form插件之ajaxForm()和ajaxSubmit()的可选参数项对象
2016/01/23 Javascript
理解js对象继承的N种模式
2016/01/25 Javascript
javascript中arguments,callee,caller详解
2016/03/16 Javascript
jquery 全选、全不选、反选效果的实现代码【推荐】
2016/05/05 Javascript
表单中单选框添加选项和移除选项
2016/07/04 Javascript
详解JavaScript节流函数中的Throttle
2016/07/16 Javascript
js实现点击按钮弹出上传文件的窗口
2016/12/23 Javascript
vue动态组件实现选项卡切换效果
2017/03/08 Javascript
深究AngularJS中ng-drag、ng-drop的用法
2017/06/12 Javascript
vue使用axios实现文件上传进度的实时更新详解
2017/12/20 Javascript
JS获取并处理php数组的方法实例分析
2018/09/04 Javascript
在vue项目中引用Iview的方法
2018/09/14 Javascript
JavaScript对象拷贝与赋值操作实例分析
2018/12/10 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【矩形情况】
2018/12/13 Javascript
深入理解Antd-Select组件的用法
2020/02/25 Javascript
一篇不错的Python入门教程
2007/02/08 Python
pyhton列表转换为数组的实例
2018/04/04 Python
如何利用Python分析出微信朋友男女统计图
2019/01/25 Python
对Python 检查文件名是否规范的实例详解
2019/06/10 Python
Python Matplotlib 基于networkx画关系网络图
2019/07/10 Python
Python中的相关分析correlation analysis的实现
2019/08/29 Python
python实现按首字母分类查找功能
2019/10/31 Python
python如何进行矩阵运算
2020/06/05 Python
用pushplus+python监控亚马逊到货动态推送微信
2021/01/29 Python
Web前端绘制0.5像素的几种方法
2017/08/11 HTML / CSS
HTML5调用手机发短信和打电话功能
2020/04/29 HTML / CSS
STRATHBERRY苏贝瑞包包官网:西班牙高级工匠手工打造
2020/11/10 全球购物
深入开展党的群众路线教育实践活动方案
2014/02/04 职场文书
自动化专业大学生职业生涯规划范文:爱拚才会赢
2014/09/12 职场文书
投诉书格式范本
2015/07/02 职场文书
React-vscode使用jsx语法的问题及解决方法
2021/06/21 Javascript