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 相关文章推荐
matplotlib绘制动画代码示例
Jan 02 Python
浅谈配置OpenCV3 + Python3的简易方法(macOS)
Apr 02 Python
详解Python下ftp上传文件linux服务器
Jun 21 Python
基于python代码实现简易滤除数字的方法
Jul 17 Python
python使用wxpy实现微信消息防撤回脚本
Apr 29 Python
Python转换时间的图文方法
Jul 01 Python
Form表单及django的form表单的补充
Jul 25 Python
python 哈希表实现简单python字典代码实例
Sep 27 Python
pygame实现俄罗斯方块游戏(AI篇1)
Oct 29 Python
Python生成随机验证码代码实例解析
Jun 09 Python
python初步实现word2vec操作
Jun 09 Python
Python Socket编程详解
Apr 25 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 var_dump遍历对象属性的函数与应用代码
2010/06/04 PHP
typecho插件编写教程(五):核心代码
2015/05/28 PHP
CodeIgniter配置之routes.php用法实例分析
2016/01/19 PHP
thinkphp5框架实现的自定义扩展类操作示例
2019/05/16 PHP
jquery ajax提交表单数据的两种实现方法
2010/04/29 Javascript
Javascript将string类型转换int类型
2010/12/09 Javascript
javascript模拟的Ping效果代码 (Web Ping)
2011/03/13 Javascript
JS多物体 任意值 链式 缓冲运动
2012/08/10 Javascript
Javascript Throttle &amp; Debounce应用介绍
2013/03/19 Javascript
jQuery 获取、设置HTML或TEXT内容的两种方法
2014/05/23 Javascript
jQuery之DOM对象和jQuery对象的转换与区别分析
2015/01/08 Javascript
vue组件间通信解析
2017/03/01 Javascript
完美实现js焦点轮播效果(二)(图片可滚动)
2017/03/07 Javascript
详解基于 axios 的 Vue 项目 http 请求优化
2017/09/04 Javascript
react同构实践之实现自己的同构模板
2019/03/13 Javascript
ES6入门教程之Array.from()方法
2019/03/23 Javascript
解决Vue @submit 提交后不刷新页面问题
2020/07/18 Javascript
JavaScript实现页面高亮操作提示和蒙板
2021/01/04 Javascript
[03:06]3分钟带你回顾DOTA2完美盛典&完美大师赛
2017/12/06 DOTA
Python数据结构与算法之二叉树结构定义与遍历方法详解
2017/12/12 Python
wxPython实现窗口用图片做背景
2018/04/25 Python
Python bytes string相互转换过程解析
2020/03/05 Python
Django 构建模板form表单的两种方法
2020/06/14 Python
django项目中使用云片网发送短信验证码的实现
2021/01/19 Python
利用CSS3 动画 绘画 圆形动态时钟
2018/03/20 HTML / CSS
TripAdvisor西班牙官方网站:全球领先的旅游网站
2018/01/10 全球购物
德国亚洲食品网上商店:asiafoodland.de
2019/12/28 全球购物
热能动力工程毕业生自荐信
2013/11/07 职场文书
幼儿园托班开学寄语
2014/01/18 职场文书
关于旷工的检讨书
2014/02/02 职场文书
《雨点儿》教学反思
2014/04/14 职场文书
预防传染病方案
2014/06/14 职场文书
出纳工作检讨书
2014/10/18 职场文书
飞越疯人院观后感
2015/06/09 职场文书
欢迎新生标语2015
2015/07/16 职场文书
详解Python如何批量采集京东商品数据流程
2022/01/22 Python