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聊天室实例程序分享
Jan 05 Python
Python使用urllib2模块抓取HTML页面资源的实例分享
May 03 Python
python Crypto模块的安装与使用方法
Dec 21 Python
python+selenium实现163邮箱自动登陆的方法
Dec 31 Python
python pandas 如何替换某列的一个值
Jun 09 Python
在PyCharm导航区中打开多个Project的关闭方法
Jan 17 Python
python requests更换代理适用于IP频率限制的方法
Aug 21 Python
python django生成迁移文件的实例
Aug 31 Python
Pytorch 卷积中的 Input Shape用法
Jun 29 Python
解决Windows下python和pip命令无法使用的问题
Aug 31 Python
Python实现扫码工具的示例代码
Oct 09 Python
Python实现随机爬山算法
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文件上传原理简单分析
2011/05/29 PHP
完美解决在ThinkPHP控制器中命名空间的问题
2017/05/05 PHP
PHP实现的简单sha1加密功能示例
2017/08/27 PHP
PHP切割整数工具类似微信红包金额分配的思路详解
2019/09/18 PHP
laravel-admin自动生成模块,及相关基础配置方法
2019/10/08 PHP
Mootools 1.2教程(2) DOM选择器
2009/09/14 Javascript
jquery自动填充勾选框即把勾选框打上true
2014/03/24 Javascript
根据配置文件加载js依赖模块
2014/12/29 Javascript
JS中产生标识符方式的演变
2015/06/12 Javascript
微信小程序 富文本转文本实例详解
2016/10/24 Javascript
JS判断时间段的实现代码
2017/06/14 Javascript
Vue.js框架路由使用方法实例详解
2017/08/25 Javascript
解决mpvue + vuex 开发微信小程序vuex辅助函数mapState、mapGetters不可用问题
2018/08/03 Javascript
angularjs的单选框+ng-repeat的实现方法
2018/09/12 Javascript
elementUI vue this.$confirm 和el-dialog 弹出框 移动 示例demo
2019/07/03 Javascript
JavaScript switch语句使用方法简介
2019/12/30 Javascript
JavaScript实现多文件下载方法解析
2020/08/07 Javascript
[54:10]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
python 动态获取当前运行的类名和函数名的方法
2014/04/15 Python
python中sys.argv参数用法实例分析
2015/05/20 Python
详解Python在七牛云平台的应用(一)
2017/12/05 Python
flask使用session保存登录状态及拦截未登录请求代码
2018/01/19 Python
python TK库简单应用(实时显示子进程输出)
2019/10/29 Python
Python读入mnist二进制图像文件并显示实例
2020/04/24 Python
利于python脚本编写可视化nmap和masscan的方法
2020/12/29 Python
兰芝美国网上商城:购买LANEIGE睡眠面膜等
2017/06/30 全球购物
澳大利亚宠物商店:Petbarn
2017/11/18 全球购物
英国索普公园票务和酒店套餐:Thorpe Breaks
2019/09/14 全球购物
关于母亲节的感言
2014/02/04 职场文书
企业整改报告范文
2014/11/08 职场文书
2014年驾驶员工作总结
2014/11/18 职场文书
担保书范文
2015/01/20 职场文书
《用字母表示数》教学反思
2016/02/17 职场文书
CSS实现章节添加自增序号的方法
2021/06/23 HTML / CSS
Nginx部署vue项目和配置代理的问题解析
2021/08/04 Servers
Python内置数据结构列表与元组示例详解
2021/08/04 Python