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 相关文章推荐
Python新手实现2048小游戏
Mar 31 Python
在Python的Flask中使用WTForms表单框架的基础教程
Jun 07 Python
python leetcode 字符串相乘实例详解
Sep 03 Python
python os.listdir按文件存取时间顺序列出目录的实例
Oct 21 Python
Python图像处理之直线和曲线的拟合与绘制【curve_fit()应用】
Dec 26 Python
python基于SMTP协议发送邮件
May 31 Python
Python 循环终止语句的三种方法小结
Jun 24 Python
python之拟合的实现
Jul 19 Python
Python爬虫库BeautifulSoup的介绍与简单使用实例
Jan 25 Python
Python中的Cookie模块如何使用
Jun 04 Python
浅谈Keras的Sequential与PyTorch的Sequential的区别
Jun 17 Python
字典算法实现及操作 --python(实用)
Mar 31 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
PHP数据库开发知多少
2006/10/09 PHP
php jquery 实现新闻标签分类与无刷新分页
2009/12/18 PHP
探讨PHP中this,self,parent的区别详解
2013/06/08 PHP
php5.5中类级别的常量使用介绍
2013/10/02 PHP
PHP实现简单日历类编写
2020/08/28 PHP
PHP safe_mode开启对于PHP系统函数有什么影响
2020/11/10 PHP
javascript中关于break,continue的特殊用法与介绍
2012/05/24 Javascript
基于jquery的放大镜效果
2012/05/30 Javascript
jQuery fadeTo方法调整图片的透明度使用介绍
2013/05/06 Javascript
在firefox和Chrome下关闭浏览器窗口无效的解决方法
2014/01/16 Javascript
JS版元素周期表实现方法
2015/08/05 Javascript
探索Javascript中this的奥秘
2016/12/11 Javascript
vue项目部署上线遇到的问题及解决方法
2018/06/10 Javascript
vuejs实现ready函数加载完之后执行某个函数的方法
2018/08/31 Javascript
微信小程序学习总结(二)样式、属性、模板操作分析
2020/06/04 Javascript
一起深入理解js中的事件对象
2021/02/06 Javascript
[43:32]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS NewBee第一场
2014/05/26 DOTA
[01:06:25]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
python迭代器实例简析
2014/09/25 Python
Python解决鸡兔同笼问题的方法
2014/12/20 Python
Python MySQLdb模块连接操作mysql数据库实例
2015/04/08 Python
Python中Django框架下的staticfiles使用简介
2015/05/30 Python
简单介绍Python中的几种数据类型
2016/01/02 Python
浅谈用VSCode写python的正确姿势
2017/12/16 Python
python如何在循环引用中管理内存
2018/03/20 Python
PyQt5每天必学之工具提示功能
2018/04/19 Python
python 获取文件下所有文件或目录os.walk()的实例
2018/04/23 Python
Python实现矩阵相乘的三种方法小结
2018/07/26 Python
numpy给array增加维度np.newaxis的实例
2018/11/01 Python
python开发实例之Python的Twisted框架中Deferred对象的详细用法与实例
2020/03/19 Python
澳大利亚在线购买儿童玩具:Toy Universe
2017/12/28 全球购物
2014年教师党员自我评价范文
2014/09/22 职场文书
2014年团支部工作总结
2014/11/17 职场文书
2014年环保局工作总结
2014/12/11 职场文书
城管年度个人总结
2015/02/28 职场文书
2015最新婚礼主持词
2015/06/30 职场文书