如果要写一个程序,让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)

时间: 2019-06-28

python动态变量名_python实现可变变量名方法详解相关推荐

  1. python accept解析_python中requests库使用方法详解

    一.什么是Requests Requests 是⽤Python语⾔编写,基于urllib,采⽤Apache2 Licensed开源协议的 HTTP 库.它⽐ urllib 更加⽅便,可以节约我们⼤量的 ...

  2. python中右对齐_Python rjust()字符串右对齐方法详解

    和ljust() 方法类似,不同之处在于,rjust() 方法是向字符串的左侧填充指定字符,从而达到右对齐文本的目的. rjust() 方法的基本格式如下: S.rjust(width[, fillc ...

  3. python 命令-python解析命令行参数的三种方法详解

    这篇文章主要介绍了python解析命令行参数的三种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 python解析命令行参数主要有三种方法: ...

  4. Python实现发送警告通知到企业微信方法详解

    常见的报警方式有:邮件,电话,短信,微信.本文将介绍如何利用Python发送警告通知到企业微信,文中的示例代码有一定的参考价值,感兴趣的可以了解一下.编程资料点击免费领取 目录 1. 新建应用 2. ...

  5. PyKivy入门教程:Kivy Python库的介绍、安装及使用方法详解

    PyKivy入门教程:Kivy Python库的介绍.安装及使用方法详解 Kivy是一个跨平台的Python GUI工具包,可以用于开发能够在多种设备和操作系统上运行的应用程序.Kivy支持触摸输入. ...

  6. python telnet线程锁_对python使用telnet实现弱密码登录的方法详解

    系统环境: 64位win7企业版 python2.7.10 2016.08.16修改内容: 1)read_until()函数是可以设置timeout的,之前不能获取到password之后的返回是因为调 ...

  7. python布尔类型运算_Python对象类型及其运算方法(详解)

    基本要点: 程序中储存的所有数据都是对象(可变对象:值可以修改 不可变对象:值不可修改) 每个对象都有一个身份.一个类型.一个值 例: >>> a1 = 'abc' >> ...

  8. php 变量代码,php中的可变变量(代码详解)

    php中的可变变量 有时候使用可变变量名是很方便的.就是说,一个变量的变量名可以动态的设置和使用.一个普通的变量通过声明来设置,例如:<?php $a = 'hello'; ?> 一个可变 ...

  9. python对文件的处理_python文件处理fileinput使用方法详解

    这篇文章主要介绍了python文件处理fileinput使用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.介绍 fileinput模块 ...

最新文章

  1. 手把手教你用Java实现AOP
  2. 【AutoML】优化方法可以进行自动搜索学习吗?
  3. 使用C语言中的宏来定位出错信息
  4. Mysql学习笔记【一、环境安装配置】
  5. 【转载】嫁给程序员的十大好处。。
  6. php服务器去广告,php – 简单的广告服务器
  7. 从头开始学JavaScript (十三)——Date类型
  8. 二级c语言 考生文件夹下,二级C语言上机新题库.doc
  9. [技巧心得] 嵌套选择器优先级
  10. GraphQL 技术浅析
  11. mysql取值范围1-10_mysql各种数据类型取值范围
  12. mysql安装包msi_【MySQL】MySQL之MySQL5.7安装包(msi文件)在Windows8下安装
  13. 扫雷win10_厉害了,一个自动扫雷游戏项目!
  14. VirtualBox 安装增强功能
  15. 【建议收藏】1000套HTML静态网页设计期末大作业 (HTML+CSS+JS)
  16. 三阶魔方入门基础教程
  17. caffe源码分析--SyncedMemory 内存管理机制
  18. 【原】移动web资源整理
  19. ARM Cortex-M3内核结构
  20. 关于编辑Windows的右键【新建】删除和添加

热门文章

  1. python optimize_python多元拟合问题
  2. proe输入数字时成双出现_什么是隔离数字输入?
  3. 学python能赚钱吗-做直播能有多赚钱,Python告诉你
  4. python自学-我是如何自学 Python 的
  5. 自学python能干什么-学习python可以做什么
  6. python编程入门指南-Python编程入门指南(上下册)
  7. 百度阿里腾讯杀入语音识别,这家公司靠什么对抗巨头
  8. 解析深度学习:语音识别实践 (俞栋等著) 完整pdf[44MB]
  9. 微信小程序开发公司哪家好?
  10. elementUI 学习入门之 Button 按钮