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写的ARP攻击代码实例
Jun 04 Python
深入讲解Python中的迭代器和生成器
Oct 26 Python
详解Python Socket网络编程
Jan 05 Python
Python 实现链表实例代码
Apr 07 Python
Python上下文管理器和with块详解
Sep 09 Python
python实现对csv文件的列的内容读取
Jul 04 Python
详解python列表生成式和列表生成式器区别
Mar 27 Python
python的pytest框架之命令行参数详解(下)
Jun 27 Python
在django中,关于session的通用设置方法
Aug 06 Python
centos7中安装python3.6.4的教程
Dec 11 Python
详解matplotlib中pyplot和面向对象两种绘图模式之间的关系
Jan 22 Python
python3定位并识别图片验证码实现自动登录功能
Jan 29 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递归算法的详细示例分析
2013/02/19 PHP
关于使用coreseek并为其做分页的介绍
2013/06/21 PHP
php将字符串转换成16进制的方法
2015/03/17 PHP
使用PHPExcel操作Excel用法实例分析
2015/03/26 PHP
symfony2.4的twig中date用法分析
2016/03/18 PHP
CI(CodeIgniter)框架实现图片上传的方法
2017/03/24 PHP
JS跨域总结
2012/08/30 Javascript
jquery实现input输入框实时输入触发事件代码
2014/01/28 Javascript
JavaScript输出所选择起始与结束日期的方法
2017/07/12 Javascript
微信小程序实现笑脸评分功能
2018/11/03 Javascript
vue-cli点击实现全屏功能
2020/03/07 Javascript
六个窍门助你提高Python运行效率
2015/06/09 Python
对TensorFlow中的variables_to_restore函数详解
2018/07/30 Python
用xpath获取指定标签下的所有text的实例
2019/01/02 Python
pandas基于时间序列的固定时间间隔求均值的方法
2019/07/04 Python
Django 实现xadmin后台菜单改为中文
2019/11/15 Python
python爬虫模拟浏览器访问-User-Agent过程解析
2019/12/28 Python
Python响应对象text属性乱码解决方案
2020/03/31 Python
Python2.x与3​​.x版本有哪些区别
2020/07/09 Python
Django CBV模型源码运行流程详解
2020/08/17 Python
python 读取、写入txt文件的示例
2020/09/27 Python
详解selenium + chromedriver 被反爬的解决方法
2020/10/28 Python
CSS3 transforms应用于背景图像的解决方法
2019/04/16 HTML / CSS
css3实现书本翻页效果的示例代码
2021/03/08 HTML / CSS
Fox Racing官方网站:越野摩托车和山地自行车装备和服装
2019/12/23 全球购物
农行实习自我鉴定
2013/09/22 职场文书
自荐信模版
2013/10/24 职场文书
应届生新闻编辑求职信
2013/11/19 职场文书
幼儿园六一儿童节主持节目串词
2014/03/21 职场文书
铣床操作工岗位职责
2014/06/13 职场文书
机电专业求职信
2014/06/14 职场文书
2014年机关作风建设工作总结
2014/10/23 职场文书
2015年教师新年寄语
2014/12/08 职场文书
2014年班级工作总结范文
2014/12/23 职场文书
党支部意见范文
2015/06/02 职场文书
python实现黄金分割法的示例代码
2021/04/28 Python