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 相关文章推荐
详解Django框架中的视图级缓存
Jul 23 Python
Django视图和URL配置详解
Jan 31 Python
python opencv旋转图像(保持图像不被裁减)
Jul 26 Python
Python实现的括号匹配判断功能示例
Aug 25 Python
Python中的random.uniform()函数教程与实例解析
Mar 02 Python
如何使用Python实现斐波那契数列
Jul 02 Python
python实现邮件发送功能
Aug 10 Python
基于Python的微信机器人开发 微信登录和获取好友列表实现解析
Aug 21 Python
基于Tensorflow:CPU性能分析
Feb 10 Python
python 穷举指定长度的密码例子
Apr 02 Python
使用jupyter notebook将文件保存为Markdown,HTML等文件格式
Apr 14 Python
Python如何配置环境变量详解
May 18 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代码
2006/12/06 PHP
php中的单引号、双引号和转义字符详解
2017/02/16 PHP
PHP实现十进制数字与二十六进制字母串相互转换操作示例
2018/08/10 PHP
XML的代替者----JSON
2007/07/21 Javascript
Javascript数组的排序 sort()方法和reverse()方法
2012/06/04 Javascript
jquery怎样实现ajax联动框(一)
2013/03/08 Javascript
jquery触发a标签跳转事件示例代码
2013/07/21 Javascript
非jQuery实现照片散落桌子上,单击放大的LightBox效果
2014/11/28 Javascript
node.js中的fs.lstatSync方法使用说明
2014/12/16 Javascript
jQuery实现调整表格单列顺序完整实例
2016/06/20 Javascript
BootStrap table表格插件自适应固定表头(超好用)
2016/08/24 Javascript
Javascript的动态增加类的实现方法
2016/10/20 Javascript
详解vue组件开发脚手架
2018/06/15 Javascript
vue-cli构建vue项目的步骤详解
2019/01/27 Javascript
JS module的导出和导入的实现代码
2019/02/25 Javascript
新手入门带你学习JavaScript引擎运行原理
2019/06/24 Javascript
详解Vue.js 作用域、slot用法(单个slot、具名slot)
2019/10/15 Javascript
js实现点击生成随机div
2020/01/16 Javascript
React生命周期原理与用法踩坑笔记
2020/04/28 Javascript
让python json encode datetime类型
2010/12/28 Python
微信跳一跳小游戏python脚本
2018/01/05 Python
Python实现确认字符串是否包含指定字符串的实例
2018/05/02 Python
基于Python对数据shape的常见操作详解
2018/12/25 Python
不可轻视HTML5!App三年内将被html5顶替彻底消失
2015/11/18 HTML / CSS
amazeui时间组件的实现示例
2020/08/18 HTML / CSS
欧洲最大的球衣网上商店:Kitbag
2017/11/11 全球购物
Coccinelle官网:意大利的著名皮具品牌
2019/05/15 全球购物
文员个人的求职信范文
2013/09/26 职场文书
人事行政主管岗位职责
2013/12/22 职场文书
保安部任务及岗位职责
2014/02/25 职场文书
学习2014年全国两会心得体会
2014/03/12 职场文书
工商局局长个人对照检查材料思想汇报
2014/09/23 职场文书
学校元旦晚会开场白
2015/05/29 职场文书
学习经验交流会策划书
2015/11/02 职场文书
Django 如何实现文件上传下载
2021/04/08 Python
python turtle绘图
2022/05/04 Python