Python 动态变量名定义与调用方法
作者:旅途 发布时间:2023-07-29 22:36:05
动态变量名赋值
在使用 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
这种方法创建的变量不会出现第一种方法中语法错误与变量作用域的错误,推荐!
来源:https://www.cnblogs.com/technologylife/p/9211324.html
猜你喜欢
- 很早就听说韩国网站的设计师们很会利用空间,来创造更多的信息承载量.最近浏览了几个韩国SHOPPING网站果不其然,就拿小小的广告轮播来说,非
- 昨天给公司服务器重做了一下系统,遇到Asp附件无法上传,之前服务器上使用好好的,怎么重做了就不正常了,于是一番google,baidu,下面
- 前言今天在开发时发现一个奇怪的问题,我手动改完数据库竟然不生效,反复确认环境无误后猜测是缓存的问题,因为是新接手的项目,代码还不熟悉,仔细一
- <'% '************************************************
- PHP getDocNamespaces() 函数实例返回 XML 文档的根节点中声明的命名空间:<?php $xml=<<
- 最近很少写CSS了,以后也可能写的会很少了,所以还是想把自已的一些经验能和大家分享一下,希望能给大家一些帮助!这篇文章主要写的提高网页在客户
- 一 MySQL WorkbenchMySQL Workbench提供DBAs和developers一个集成工具环境:1)数据库设计和建模2)
- 代码如下:<% set studentinstance = CreateStudent()&n
- 这是份总结,有不恰达的地方欢迎一同讨论联系方式 : 龙藏 longzang@taobao.com点击这里全幅围观或者点下面大图去 slide
- 原文地址:30 Days of Mootools 1.2 Tutorials - Day 22 - Fx.Elements通过
- 农业银行总行1998年以来正式推广了新版网络版综合业务统计信息系统,该系统是基于WindowsNT4.0平台,采用客户/服务器模式,以Mic
- 我们首先来看下实例代码:function sig_handler($sig){ print("handled sig:
- PDO::quotePDO::quote — 为SQL语句中的字符串添加引号。(PHP 5 >= 5.1.0, PECL pdo &g
- 方法一:利用Cookies对象 因为Cookies对象把变量的值保存在浏览器客户端,所以可以根据Cookies保存的IsVoted的值来判断
- 在这个星期Doug Bowman离开谷歌的Twitter引发了很多激烈的讨论.在残酷的诚实邮件中,Doug Bowman援引谷歌”限制性的数
- 昨天在网上看到一个防采集软件,说采集只访问当前网页,不会访问网页的图片、JS等,今天突然想到,通过动态程序和Js访问分别记录访问者的IP,然
- 一套javascript摇奖程序,随机6+1选号码,类似游戏彩票摇奖效果,实时滚动。截图:<style>.inp{ width:
- 1.因为oracle 10g暂时没有与win7兼容的版本,我们可以通过对安装软件中某些文件的修改达到安装的目地。 a)打开“\ORACLE1
- 首先我们一起来看下 Character entities references (HTML Entities)和 Numeric Chara
- 在数据库应用的设计中,我们往往会需要获取某些表的记录总数,用于判断表的记录总数是否过大,是否需要备份数据等。我们通常的做法是:select