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 切片和range()用法说明
Mar 24 Python
paramiko模块安装和使用(远程登录服务器)
Jan 27 Python
在Python中操作字符串之rstrip()方法的使用
May 19 Python
Python使用requests发送POST请求实例代码
Jan 25 Python
python获取文件路径、文件名、后缀名的实例
Apr 23 Python
Python帮你微信头像任意添加装饰别再@微信官方了
Sep 25 Python
Python While循环语句实例演示及原理解析
Jan 03 Python
Python变量作用域LEGB用法解析
Feb 04 Python
详解anaconda离线安装pytorchGPU版
Sep 08 Python
详解基于Scrapy的IP代理池搭建
Sep 29 Python
Selenium获取登录Cookies并添加Cookies自动登录的方法
Dec 04 Python
用python实现一个简单的验证码
Dec 09 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 配置文件中open_basedir选项作用
2009/07/19 PHP
PHP 5.3新特性命名空间规则解析及高级功能
2010/03/11 PHP
PHP开启opcache提升代码性能
2015/04/26 PHP
tp5.1 框架数据库常见操作详解【添加、删除、更新、查询】
2020/05/26 PHP
Javascript操纵Cookie实现购物车程序
2007/02/15 Javascript
Jquery实现无刷新DropDownList联动实现代码
2010/03/08 Javascript
js Date概念详细介绍
2013/11/22 Javascript
node.js中的url.parse方法使用说明
2014/12/10 Javascript
Javascript实现Array和String互转换的方法
2015/12/21 Javascript
浅析JavaScript Array和string的转换(推荐)
2016/05/20 Javascript
浅谈JavaScript 浏览器对象
2016/06/03 Javascript
JS去除空格和换行的正则表达式(推荐)
2016/06/14 Javascript
利用jquery实现下拉框的禁用与启用
2016/12/07 Javascript
微信小程序 页面之间传参实例详解
2017/01/13 Javascript
如何正确理解javascript的模块化
2017/03/02 Javascript
在小程序中使用Echart图表的示例代码
2018/08/02 Javascript
详解如何使用微信小程序云函数发送短信验证码
2019/03/13 Javascript
vue组件化中slot的基本使用方法
2019/05/01 Javascript
微信小程序日历弹窗选择器代码实例
2019/05/09 Javascript
原生js实现滑块区间组件
2021/01/20 Javascript
[47:46]完美世界DOTA2联赛 Magma vs GXR 第三场 11.07
2020/11/10 DOTA
python检查字符串是否是正确ISBN的方法
2015/07/11 Python
5种Python单例模式的实现方式
2016/01/14 Python
python中(str,list,tuple)基础知识汇总
2018/02/20 Python
python控制台实现tab补全和清屏的例子
2019/08/20 Python
python 读取更新中的log 或其它文本方式
2019/12/24 Python
Python如何使用内置库matplotlib绘制折线图
2020/02/24 Python
Python的Tqdm模块实现进度条配置
2021/02/24 Python
美国婚礼和派对礼品网站:Kate Aspen(新娘送礼会、迎婴派对)
2018/03/28 全球购物
StringBuilder和String的区别
2015/05/18 面试题
酒店保安领班职务说明书
2014/03/04 职场文书
2014年汽车销售工作总结
2014/12/01 职场文书
2015年机关作风和效能建设工作总结
2015/07/23 职场文书
2016新春团拜会致辞
2015/08/01 职场文书
《酸的和甜的》教学反思
2016/02/18 职场文书
基于PyQt5制作一个群发邮件工具
2022/04/08 Python