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 sys模块sys.path使用方法示例
Dec 04 Python
Python中字典的setdefault()方法教程
Feb 07 Python
Python中标准库OS的常用方法总结大全
Jul 19 Python
python 自动去除空行的实例
Jul 24 Python
pyqt5实现俄罗斯方块游戏
Jan 11 Python
代码实例讲解python3的编码问题
Jul 08 Python
Python2和3字符编码的区别知识点整理
Aug 08 Python
Django ORM 聚合查询和分组查询实现详解
Aug 09 Python
python3 requests库文件上传与下载实现详解
Aug 22 Python
深入了解Python在HDA中的应用
Sep 05 Python
Python新手学习函数默认参数设置
Jun 03 Python
python编程学习使用管道Pipe编写优化代码
Nov 20 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 - Html Transfer Code
2006/10/09 PHP
PHP计数器的实现代码
2013/06/08 PHP
php生成Android客户端扫描可登录的二维码
2016/05/13 PHP
jquery photoFrame 图片边框美化显示插件
2010/06/28 Javascript
js控制的遮罩层实例介绍
2013/05/29 Javascript
js菜单点击显示或隐藏效果的简单实例
2014/01/13 Javascript
JavaScript获取网页支持表单字符集的方法
2015/04/02 Javascript
JQuery中DOM事件冒泡实例分析
2015/06/13 Javascript
JSON 的正确用法探讨:Pyhong、MongoDB、JavaScript与Ajax
2016/05/15 Javascript
Vue.js教程之计算属性
2016/11/11 Javascript
Javascript中字符串replace方法的第二个参数探究
2016/12/05 Javascript
正则 js分转元带千分符号详解
2017/03/08 Javascript
Angular 通过注入 $location 获取与修改当前页面URL的实例
2017/05/31 Javascript
JavaScript之Canvas_动力节点Java学院整理
2017/07/04 Javascript
推荐VSCode 上特别好用的 Vue 插件之vetur
2017/09/14 Javascript
vue 使用自定义指令实现表单校验的方法
2018/08/28 Javascript
让你30分钟快速掌握vue3教程
2020/10/26 Javascript
[54:57]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第二场 1月8日
2021/03/11 DOTA
python版简单工厂模式
2017/10/16 Python
python脚本实现音频m4a格式转成MP3格式的实例代码
2019/10/09 Python
使用python动态生成波形曲线的实现
2019/12/04 Python
Python Lambda函数使用总结详解
2019/12/11 Python
python中操作文件的模块的方法总结
2021/02/04 Python
CSS3中currentColor关键字的妙用
2016/02/27 HTML / CSS
Willer台湾:日本高速巴士/夜行巴士预约
2017/07/09 全球购物
日本索尼音乐商店:Sony Music Shop
2018/07/17 全球购物
New Balance德国官方网站:购买鞋子和服装
2019/08/31 全球购物
Jar包的作用是什么
2014/03/30 面试题
夜班门卫岗位职责
2013/12/09 职场文书
客服部工作职责范本
2014/02/14 职场文书
学习走群众路线心得体会
2014/11/05 职场文书
2014年营业员工作总结
2014/11/18 职场文书
我的1919观后感
2015/06/03 职场文书
超级实用!五步法则,教你写好年终工作总结
2019/12/05 职场文书
基于Redis实现分布式锁的方法(lua脚本版)
2021/05/12 Redis
详解JAVA中的OPTIONAL
2021/06/14 Java/Android