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中使用__slots__方法的详细教程
Apr 28 Python
Python中的anydbm模版和shelve模版使用指南
Jul 09 Python
pandas数据分组和聚合操作方法
Apr 11 Python
Django 使用Ajax进行前后台交互的示例讲解
May 28 Python
Python数据抓取爬虫代理防封IP方法
Dec 23 Python
Python使用paramiko操作linux的方法讲解
Feb 25 Python
pandas计算最大连续间隔的方法
Jul 04 Python
选择Python写网络爬虫的优势和理由
Jul 07 Python
浅谈Python中函数的定义及其调用方法
Jul 19 Python
利用PyCharm操作Github(仓库新建、更新,代码回滚)
Dec 18 Python
python numpy 矩阵堆叠实例
Jan 17 Python
Python关于OS文件目录处理的实例分享
May 23 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
弄了个检测传输的参数是否为数字的Function
2006/12/06 PHP
MySQL中create table语句的基本语法是
2007/01/15 PHP
php自动加载机制的深入分析
2013/06/08 PHP
非常重要的php正则表达式详解
2016/01/04 PHP
ThinkPHP框架结合Ajax实现用户名校验功能示例
2019/07/03 PHP
JavaScript日历实现代码
2010/09/12 Javascript
JS代码同步文本框内容的实例方法
2013/07/12 Javascript
实现51Map地图接口(示例代码)
2013/11/22 Javascript
在Ubuntu上安装最新版本的Node.js
2014/07/14 Javascript
JavaScript跨平台的开源框架NativeScript
2015/03/24 Javascript
Windows环境下npm install 报错: operation not permitted, rename的解决方法
2016/09/26 Javascript
聊一聊JS中的prototype
2016/09/29 Javascript
javascript 判断用户有没有操作页面
2017/10/17 Javascript
JS实现的JSON数组去重算法示例
2018/04/11 Javascript
JS实现的判断方法、变量是否存在功能示例
2020/03/28 Javascript
vue+element UI实现树形表格带复选框的示例代码
2019/04/16 Javascript
vue移动端使用canvas签名的实现
2020/01/15 Javascript
python基础教程之类class定义使用方法
2014/02/20 Python
Python测试网络连通性示例【基于ping】
2018/08/03 Python
pandas DataFrame 交集并集补集的实现
2019/06/24 Python
详解python深浅拷贝区别
2019/06/24 Python
python利用wx实现界面按钮和按钮监听和字体改变的方法
2019/07/17 Python
关于PyTorch 自动求导机制详解
2019/08/18 Python
Python实现对word文档添加密码去除密码的示例代码
2020/12/29 Python
全球在线商店:BerryLook
2019/04/14 全球购物
意大利在线眼镜精品店:Ottica Lipari
2019/11/11 全球购物
将相和教学反思
2014/02/04 职场文书
幼儿教师培训感言
2014/03/08 职场文书
七年级上册语文教学计划
2015/01/22 职场文书
幼儿园小班开学寄语
2015/05/27 职场文书
七一慰问简报
2015/07/20 职场文书
2016年教师节感恩寄语
2015/12/04 职场文书
MYSQL(电话号码,身份证)数据脱敏的实现
2021/05/28 MySQL
Mysql 如何查询时间段交集
2021/06/08 MySQL
「睡美人」爱洛公主粘土人开订
2022/03/22 日漫
Anaconda安装pytorch和paddle的方法步骤
2022/04/03 Python