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代码来绘制彭罗斯点阵的教程
Apr 03 Python
在Python中使用__slots__方法的详细教程
Apr 28 Python
Python3使用PyQt5制作简单的画板/手写板实例
Oct 19 Python
通过Python模块filecmp 对文件比较的实现方法
Jun 29 Python
Django使用paginator插件实现翻页功能的实例
Oct 24 Python
Python实现计算字符串中出现次数最多的字符示例
Jan 21 Python
python random从集合中随机选择元素的方法
Jan 23 Python
利用Python小工具实现3秒钟将视频转换为音频
Oct 29 Python
python3 实现函数写文件路径的正确方法
Nov 27 Python
Selenium使用Chrome模拟手机浏览器方法解析
Apr 10 Python
Python接口测试数据库封装实现原理
May 09 Python
python:HDF和CSV存储优劣对比分析
Jun 08 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
非洲第一个咖啡超凡杯大赛承办国—卢旺达的咖啡怎么样
2021/03/03 咖啡文化
使用php实现下载生成某链接快捷方式的解决方法
2013/05/07 PHP
PHP的password_hash()使用实例
2014/03/17 PHP
jQuery实现表单input中提示文字value随鼠标焦点移进移出而显示或隐藏的代码
2010/03/21 Javascript
通过javascript的匿名函数来分析几段简单有趣的代码
2010/06/29 Javascript
TextArea设置MaxLength属性最大输入值的js代码
2012/12/21 Javascript
动态标签 悬停效果 延迟加载示例代码
2013/11/21 Javascript
通过jquery 获取URL参数并进行转码
2014/08/18 Javascript
js获取域名的方法
2015/01/27 Javascript
跟我学习JScript的Bug与内存管理
2015/11/18 Javascript
Javascript removeChild()删除节点及删除子节点的方法
2015/12/27 Javascript
基于bootstrap的选择框插件icheck
2016/12/23 Javascript
jQuery实现的别踩白块小游戏完整示例
2019/01/07 jQuery
[01:18]一目了然!DOTA2DotA快捷操作对比第一弹
2014/07/01 DOTA
[03:38]TI4西雅图DOTA2前线报道 71专访
2014/07/08 DOTA
[00:31]DOTA2荣耀之路7:Miracle-空血无敌斩
2018/05/31 DOTA
[01:29:17]RNG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
[01:14:19]NAVI vs Mineski 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
Python求两个list的差集、交集与并集的方法
2014/11/01 Python
python 循环读取txt文档 并转换成csv的方法
2018/10/26 Python
python使用turtle绘制国际象棋棋盘
2019/05/23 Python
基于Tensorflow高阶读写教程
2020/02/10 Python
解决Tensorboard 不显示计算图graph的问题
2020/02/15 Python
如何基于python实现年会抽奖工具
2020/10/20 Python
使用HTML5技术开发一个属于自己的超酷颜色选择器
2013/09/22 HTML / CSS
银行见习期自我鉴定
2014/01/29 职场文书
高二化学教学反思
2014/01/30 职场文书
社会实践先进工作者事迹材料
2014/05/06 职场文书
十佳青年事迹材料
2014/08/21 职场文书
报到证办理个人委托书
2014/10/06 职场文书
质量保证书格式
2015/02/27 职场文书
求职信格式范文
2015/03/19 职场文书
学校教学工作总结2015
2015/05/19 职场文书
受欢迎的自荐信,就这么写!
2019/04/19 职场文书
MongoDB修改oplog大小的四种方法
2022/04/11 MongoDB
《火纹风花雪月无双》预告“神秘雇佣兵” 紫发剑客
2022/04/13 其他游戏