zoukankan      html  css  js  c++  java
  • Python 动态变量名定义与调用方法

    动态变量名赋值
    在使用 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 “”, line 1
    12_month = temp
    ^
    SyntaxError: invalid token

    2、这种方法定义的变量,只在 exec 中有效,在 exec 语句外便无效,这或许是因为python将 exec 中复杂的指令当做了局部变量,可以在利用以下语句检验

    for n in range(1, 13):
    exec('month_{} = temp print(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
     
    非常感谢你的阅读
    ————————————————
    版权声明:本文为CSDN博主「程序员牡蛎」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/chengxun03/article/details/105670160

    你有什么心态,就有什么样的人生。管不好自己的心态,注定你就是个弱者。
  • 相关阅读:
    mysql常用操作语句
    开启端口命令
    在linux终端远程登陆linux服务器
    CentOS个人目录下中文路径转英文路径
    安装MariaDB和简单配置
    centos 7.1 apache 源码编译安装
    PHP页面跳转
    一亿个不重复的随机数算法
    HTML中添加背景
    SQL语法
  • 原文地址:https://www.cnblogs.com/LQZ888/p/12753153.html
Copyright © 2011-2022 走看看