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 相关文章推荐
详解python3百度指数抓取实例
Dec 12 Python
Python进程间通信Queue实例解析
Jan 25 Python
Python 3.6 读取并操作文件内容的实例
Apr 23 Python
十分钟搞定pandas(入门教程)
Jun 21 Python
python创建ArcGIS shape文件的实现
Dec 06 Python
Matplotlib scatter绘制散点图的方法实现
Jan 02 Python
python实现删除列表中某个元素的3种方法
Jan 15 Python
pycharm的python_stubs问题
Apr 08 Python
python库skimage给灰度图像染色的方法示例
Apr 27 Python
Python configparser模块操作代码实例
Jun 08 Python
Python3如何使用range函数替代xrange函数
Oct 05 Python
python 实现数据库中数据添加、查询与更新的示例代码
Dec 07 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数据到Excel文件(fputcsv)
2011/07/03 PHP
php+jQuery.uploadify实现文件上传教程
2014/12/26 PHP
php中yii框架实例用法
2020/12/22 PHP
通用于ie和firefox的函数 GetCurrentStyle (obj, prop)
2006/12/27 Javascript
JavaScript 字符串与数组转换函数[不用split与join]
2009/12/13 Javascript
js监听表单value的修改同步问题,跨浏览器支持
2009/12/31 Javascript
基于jQuery的合并表格中相同文本的相邻单元格的代码
2011/04/06 Javascript
js+html+css实现鼠标移动div实例
2013/01/30 Javascript
jQuery知识点整理
2015/01/30 Javascript
Javascript动画效果(3)
2016/10/11 Javascript
基于JavaScript表单脚本(详解)
2017/10/18 Javascript
微信小程序实现给嵌套template模板传递数据的方式总结
2017/12/18 Javascript
详解设置Webstorm 利用babel将ES6自动转码成ES5
2017/12/20 Javascript
Vue 父子组件的数据传递、修改和更新方法
2018/03/01 Javascript
详解微信小程序与内嵌网页交互实现支付功能
2018/10/22 Javascript
使用Vue.js 和Chart.js制作绚丽多彩的图表
2019/06/15 Javascript
JavaScript函数重载操作实例浅析
2020/05/02 Javascript
[36:20]KG vs SECRET 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
python的else子句使用指南
2016/02/27 Python
Python字符编码判断方法分析
2016/07/01 Python
Python中不同进制的语法及转换方法分析
2016/07/27 Python
详解Django中间件执行顺序
2018/07/16 Python
Python pycharm 同时加载多个项目的方法
2019/01/17 Python
PyQt打开保存对话框的方法和使用详解
2019/02/27 Python
Python图像处理模块ndimage用法实例分析
2019/09/05 Python
通过celery异步处理一个查询任务的完整代码
2019/11/19 Python
python3爬虫中异步协程的用法
2020/07/10 Python
Python使用struct处理二进制(pack和unpack用法)
2020/11/12 Python
python实现视频压缩功能
2020/12/18 Python
彪马日本官网:PUMA日本
2019/01/31 全球购物
Java多态性的定义以及类型
2014/09/16 面试题
四风自我剖析材料思想汇报
2014/10/01 职场文书
接收函格式
2015/01/30 职场文书
乡镇法制宣传日活动总结
2015/05/05 职场文书
盲山观后感
2015/06/11 职场文书
公司行政管理制度范本
2015/08/05 职场文书