python实现可变变量名方法详解

作者:步履不停 时间:2021-04-23 11:42:49 

如果要写一个程序,让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,可变,变量名
0
投稿

猜你喜欢

  • 纯ASP结合VML生成完美图-折线图

    2010-05-11 16:50:00
  • asp.net DropDownList实现二级联动效果

    2023-07-23 07:48:41
  • 详解django中自定义标签和过滤器

    2021-02-16 19:43:38
  • Python寻找路径和查找文件路径的示例

    2023-05-01 10:36:37
  • asp 通用修改和增加函数代码

    2011-03-16 11:15:00
  • 数据库安全应用 使用MySQL的23个注意事项

    2009-05-13 10:27:00
  • Python使用内置json模块解析json格式数据的方法

    2023-07-30 14:10:45
  • Python多线程中阻塞(join)与锁(Lock)使用误区解析

    2022-03-22 08:00:31
  • “验证码”等于“流氓软件”

    2007-10-19 18:29:00
  • PHP实现的curl批量请求操作示例

    2023-11-17 01:51:10
  • 不通过数据源名DSN也能访问Access数据库吗?

    2009-10-29 12:22:00
  • 使用PHP生成二维码的两种方法(带logo图像)

    2023-11-14 11:00:30
  • CSS布局之浮动(二)三列浮动

    2008-08-19 12:47:00
  • Python中的数学运算操作符使用进阶

    2021-05-24 16:05:46
  • js实现的捐赠管理完整实例

    2023-08-22 05:25:14
  • php官方微信接口大全(微信支付、微信红包、微信摇一摇、微信小店)

    2023-10-17 14:16:56
  • 自定义Django_rest_framework_jwt登陆错误返回的解决

    2021-02-27 22:07:32
  • SQL语句练习实例之四 找出促销活动中销售额最高的职员

    2011-11-03 16:47:03
  • 由 IE8 User-Agent 更新想到的

    2009-01-12 18:33:00
  • MySQL数据库中与 ALTER TABLE 有关的问题

    2009-01-14 11:57:00
  • asp之家 网络编程 m.aspxhome.com