Python 动态变量名定义与调用方法


Posted in Python onFebruary 09, 2020

动态变量名赋值
在使用 tkinter 时需要动态生成变量,如动态生成 var1...var10 变量。

使用 exec 动态赋值

exec 在 python3 中是内置函数,它支持 python 代码的动态执行。

示例:

In [1]: for i in range(5):
  ...:   exec('var{} = {}'.format(i, i))
  ...:

In [2]: print(var0, var1, var2, var3 ,var4)
0 1 2 3 4

利用命名空间动态赋值

在Python的命名空间中,将变量名与值存储在字典中,
可以通过locals()globals()函数分别获取局部命名空间和全局命名空间。

示例

>>> names = locals()
>>> for i in range(5):
...   names['n' + str(i) ] = i
...
>>> print(n0, n1, n2, n3, n4)
0 1 2 3 4
>>>

在类中使用动态变量

Python 的类对象的属性储存在的 __dict__ 中。__dict__ 是一个词典,键为属性名,值对应属性的值。

示例

>>> print(n0, n1, n2, n3, n4)
0 1 2 3 4
>>> class Test_class(object):
...   def __init__(self):
...     names = self.__dict__
...     for i in range(5):
...       names['n' + str(i)] = i
...
>>> t = Test_class()
>>> print(t.n0, t.n1, t.n2, t.n3, t.n4)
0 1 2 3 4

调用动态变量

事实上,对于重复性的变量,我们一般不会这样调用变量,如:var0, var1, var2, var3 ,var4....varN,可以利用下面方法动态调用变量。

先定义如下变量:

示例

>>> for i in range(5):
...   exec('var{} = {}'.format(i, i))
...
>>> print(var0, var1, var2, var3 ,var4)
0 1 2 3 4

利用 exec 函数

同样地,可以使用 exec 调用变量

In [3]: for i in range(5):
  ...:   exec('print(var{}, end=" ")'.format(i))
  ...:
0 1 2 3 4

利用命名空间

因为命令空间的locals()globals()均会返回一个字典,利用字典的get方法获取变量的值

In [4]: names = locals()

In [5]: for i in range(5):
  ...:  print(names.get('var' + str(i)), end=' ')
  ...:
0 1 2 3 4

下面是其他网友的补充

Python 定义动态变量

问题描述

在做数据处理时,对一些分组得来的数据,所做的操作大同小异,变量的命名也都拥有相同的结构,比如对每个月份的数据求均值、方差等统计量,变量的命名可取为“n月的均值”,“n月的方差”,抽象出来就是“n月的 'm统计量' ”

在编程实现的时候,对上述变量的定义以及引用,都可以一同实现,从而减少了重复代码的数量

实现的时候遇到了动态定义变量的问题,这里总结一下

利用 exec 动态定义变量

我们可以如此动态定义变量

for n in range(1, 13):
   exec('month_{} = {}'.format(n, value or expression))

一般这种语句都可以正确定义变量,但有时上述语句会出错,比如后方传入的expression返回一个 DataFrameGroupBy 类变量时,会出现语法错误

  File "<string>", line 1
    month_12 = <pandas.core.groupby.generic.DataFrameGroupBy object at 0x000001F40E46E160>
               ^
SyntaxError: invalid syntax

原因未明...经过搜索,我发现还有另一种定义方法,可以解决上述问题

for n in range(1, 13):
   exec('month_{} = temp'.format(n), {'temp': expression})

这种方法有两个问题:

1、利用format替换的部分需在变量名的最后方,例 month_{} ,方可执行成功,而 {}_month 便不可行,原因待查...还请各位同学指点!

File "<string>", line 1
    12_month = temp
      ^
SyntaxError: invalid token

2、这种方法定义的变量,只在 exec 中有效,在 exec 语句外便无效,这或许是因为python将 exec 中复杂的指令当做了局部变量,可以在利用以下语句检验

for n in range(1, 13):
   exec('month_{} = temp\nprint(locals()==globals())'.format(n), {'temp': expression})

其中locals()与globals()是python的内部方法,它们提供了基于字典的访问局部与全局变量的方式。

如果返回 True ,说明当前环境处于全局级别,在 exec 中的语句可以在 exec 外生效

如果返回 False ,说明当期环境处于局部级别,定义的变量被看做局部变量,所以不能在 exec 外调用,可以在语句中传入globals()使其在全局生效

for n in range(1, 13):
   exec('month_{} = temp'.format(n), {'temp': expression}, globals())

 exec 方式太容易混乱,还有另外一种动态定义变量的方法,便是上文提到的globals()与locals()方法

利用命名空间动态定义变量

首先创建locals()的副本

varDict = locals()

对于上文提到的变量便可如此定义

for n in range(1, 13):
  varDict['month_'+str(n)] = value or expression

这种方法创建的变量不会出现第一种方法中语法错误与变量作用域的错误,推荐!

Python 相关文章推荐
python3生成随机数实例
Oct 20 Python
python获取标准北京时间的方法
Mar 24 Python
python搭建虚拟环境的步骤详解
Sep 27 Python
Python中如何获取类属性的列表
Dec 26 Python
Python基于递归算法实现的汉诺塔与Fibonacci数列示例
Apr 18 Python
Python读取txt文件数据的方法(用于接口自动化参数化数据)
Jun 27 Python
Django ManyToManyField 跨越中间表查询的方法
Dec 18 Python
windows10下安装TensorFlow Object Detection API的步骤
Jun 13 Python
Python实现代码统计工具
Sep 19 Python
pandas实现将日期转换成timestamp
Dec 07 Python
解决python图像处理图像赋值后变为白色的问题
Jun 04 Python
浅谈Python数学建模之数据导入
Jun 23 Python
python函数定义和调用过程详解
Feb 09 #Python
详解python 破解网站反爬虫的两种简单方法
Feb 09 #Python
Python字典深浅拷贝与循环方式方法详解
Feb 09 #Python
Python文件操作方法详解
Feb 09 #Python
Python列表操作方法详解
Feb 09 #Python
Python2与Python3的区别详解
Feb 09 #Python
python默认参数调用方法解析
Feb 09 #Python
You might like
数据库相关问题
2006/10/09 PHP
PHP实现的简单三角形、矩形周长面积计算器分享
2014/11/18 PHP
Zend Framework教程之模型Model基本规则和使用方法
2016/03/04 PHP
PHP自定义函数实现assign()数组分配到模板及extract()变量分配到模板功能示例
2018/05/23 PHP
PHP标准库(PHP SPL)详解
2019/03/16 PHP
浅析PHP echo 和 print 语句
2020/06/30 PHP
javascript实现的基于金山词霸网络翻译的代码
2010/01/15 Javascript
jQuery Tools Dateinput使用介绍
2012/07/14 Javascript
JS实现选中当前菜单后高亮显示的导航条效果
2015/10/15 Javascript
jQuery页面刷新(局部、全部)问题分析
2016/01/09 Javascript
轻量级jQuery插件slideBox实现带底栏轮播(焦点图)代码
2016/03/28 Javascript
jQuery操作动态生成的内容的方法
2016/05/28 Javascript
JavaScript基础语法之js表达式
2016/06/07 Javascript
request请求获取参数的实现方法(post和get两种方式)
2016/09/27 Javascript
JS奇技之利用scroll来监听resize详解
2017/06/15 Javascript
详解JavaScript 中 if / if...else...替换方式
2018/07/15 Javascript
vue-router 实现导航守卫(路由卫士)的实例代码
2018/09/02 Javascript
微信小程序使用template标签实现五星评分功能
2018/11/03 Javascript
这样回答继承可能面试官更满意
2019/12/10 Javascript
Vue解决echart在element的tab切换时显示不正确问题
2020/08/03 Javascript
Python爬虫框架Scrapy安装使用步骤
2014/04/01 Python
python数据结构之图深度优先和广度优先实例详解
2015/07/08 Python
解决python selenium3启动不了firefox的问题
2018/10/13 Python
Python爬取YY评级分数并保存数据实现过程解析
2020/06/01 Python
Python如何给你的程序做性能测试
2020/07/29 Python
大学生求职推荐信
2013/11/27 职场文书
人力资源部培训专员岗位职责
2014/01/02 职场文书
大学生蛋糕店创业计划书
2014/01/13 职场文书
金融系毕业生自荐书
2014/07/08 职场文书
集体生日活动方案
2014/08/18 职场文书
解除劳动合同证明书
2014/09/26 职场文书
写景作文评语集锦
2014/12/25 职场文书
CSS 新特性 contain控制页面的重绘与重排问题
2021/04/30 HTML / CSS
Django显示可视化图表的实践
2021/05/10 Python
JavaScript canvas实现流星特效
2021/05/20 Javascript
CSS实现单选折叠菜单功能
2021/11/01 HTML / CSS