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刷投票的脚本实现代码
Nov 08 Python
Python兔子毒药问题实例分析
Mar 05 Python
python使用wxPython打开并播放wav文件的方法
Apr 24 Python
Django的数据模型访问多对多键值的方法
Jul 21 Python
[原创]python爬虫(入门教程、视频教程)
Jan 08 Python
python自动发邮件库yagmail的示例代码
Feb 23 Python
python3.x上post发送json数据
Mar 04 Python
python中pip的安装与使用教程
Aug 10 Python
关于python列表增加元素的三种操作方法
Aug 22 Python
python使用Matplotlib画条形图
Mar 25 Python
使用Selenium破解新浪微博的四宫格验证码
Oct 19 Python
Python测试框架pytest高阶用法全面详解
Jun 01 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
怎样在UNIX系统下安装MySQL
2006/10/09 PHP
深入PHP与浏览器缓存的分析
2013/06/03 PHP
PHP设计模式之解释器模式的深入解析
2013/06/13 PHP
php创建sprite
2014/02/11 PHP
使用Codeigniter重写insert的方法(推荐)
2017/03/23 PHP
PHP有序表查找之插值查找算法示例
2018/02/10 PHP
Laravel框架使用技巧之使用url()全局函数返回前一个页面的地址方法详解
2020/04/06 PHP
List Installed Software Features
2007/06/11 Javascript
javascript实现获取服务器时间
2015/05/19 Javascript
JavaScript原生数组Array常用方法
2017/04/06 Javascript
浅析Angular2子模块以及异步加载
2017/04/24 Javascript
js评分组件使用详解
2017/06/06 Javascript
JavaScript实现简单图片轮播效果
2017/08/21 Javascript
Vue.js实现的购物车功能详解
2019/01/27 Javascript
vue发送websocket请求和http post请求的实例代码
2019/07/11 Javascript
Python 正则表达式(转义问题)
2014/12/15 Python
简单介绍Python中的RSS处理
2015/04/13 Python
详解Python3操作Mongodb简明易懂教程
2017/05/25 Python
Python中pow()和math.pow()函数用法示例
2018/02/11 Python
Python opencv实现人眼/人脸识别以及实时打码处理
2019/04/29 Python
用Python实现职工信息管理系统
2020/12/30 Python
利用CSS3实现的文字定时向上滚动
2016/08/29 HTML / CSS
台湾母婴用品限时团购:妈咪爱
2018/08/03 全球购物
一家外企的面试题目(C/C++面试题,C语言面试题)
2014/03/24 面试题
什么是符号链接,什么是硬链接?符号链接与硬链接的区别是什么?
2014/01/19 面试题
优秀员工自荐信范文
2013/10/05 职场文书
毕业生的自我评价
2013/12/30 职场文书
十佳护士先进事迹
2014/05/08 职场文书
群众路线教育实践活动自我剖析思想汇报
2014/10/04 职场文书
大学生在校表现评语
2014/12/31 职场文书
草房子读书笔记
2015/06/29 职场文书
离婚起诉书范文2016
2015/11/26 职场文书
情侣餐厅的创业计划书范本!
2019/07/26 职场文书
react合成事件与原生事件的相关理解
2021/05/13 Javascript
Pygame Event事件模块的详细示例
2021/11/17 Python
win sever 2022如何占用操作主机角色
2022/06/25 Servers