网络编程
位置:首页>> 网络编程>> Python编程>> Python 动态变量名定义与调用方法

Python 动态变量名定义与调用方法

作者:旅途  发布时间:2023-07-29 22:36:05 

标签: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 "<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

0
投稿

猜你喜欢

  • 如下所示:# -*- coding: utf-8 -*-import sys, urllib, urllib2, jsoncity=urll
  • 一般情况下,使用pip命令安装即可:[root@dthost27 ~]# pip install mysql-python但是在实际工作环境
  • 场景描述在update表的时候出现DeadlockLoserDataAccessException异常 (Deadlock found wh
  • 网上下载mayavi的官方帮助文档,里面有很多例子,下面的记录都是查看手册后得到的。http://code.enthought.com/pr
  • 据了解绝大多数开发人员对于索引的理解都是一知半解,局限于大多数日常工作没有机会、也什么没有必要去关心、了解索引,实在哪天某个查询太慢了找到查
  • 变量存储在内存中的值。这就意味着在创建变量时会在内存中开辟一个空间。基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存
  • 这个间歇性向上滚动js代码很适合做广告展示,友情链接等等。与平常的无缝向上连续滚动不同的是它每滚动一个就会停顿一会儿。<!DOCTYP
  • 传递函数创建传递函数有两种方式:import control as ctrl# 方式 1s = ctrl.tf('s')sy
  • Ewebeditor及fckeditork,90%的网站都是采用这两种编辑器作为产品或者内容的说明部分的编辑窗口,近日,一客户的外贸站点基本
  • 通过 Vue.js 的过渡系统,你可以轻松的为 DOM 节点 * 入/移除的过程添加过渡动画效果。Vue 将会在适当的时机添加/移除 CSS
  • 本文详细讲述了python的内嵌time模块的用法。分享给大家供大家参考之用。具体分析如下:  一、简介time模块提供各种操作时
  • 如下所示:# coding:utf-8import shapefilew = shapefile.Writer()w.autoBalance
  • 目录前言算法原理目标函数算法流程 Python实现总结前言K-Means 是一种非常简单的聚类算法(聚类算法都属于无监督学习)。给
  • 本文实例为大家分享了python实现日历效果的具体代码,供大家参考,具体内容如下一、代码编程过程1、根据年月日算出星期几def get_we
  • 目录前言二叉树节点定义递归构建二叉树前言本文的内容是数据结构中二叉树部分最基础的,之所以写一下主要是为了方便刷题的时候,能够在自己电脑上很快
  • 在前一文中记述了Access启动不了,或者出现“正在准备安装……”的问题,今天则找到了Access对控件支持的问题。本来Access、Exc
  • 前言今天我看到线性规划模型开头的介绍,特别不错,因此,我把它记录下来了,分享给大家在工程技术、经济管理、科学研究、军事作战训练及日常生活等众
  • 合成微缩效果前言图像中的模糊效果可以强烈影响被拍摄场景的感知,模糊在传达所需的尺寸和距离感方面起着重要作用。合成微缩 (miniature
  • 本文实例实现的功能是监控一个文件或目录的变化,如果有变化,把文件上传备份至备份主机,并且要监控上传过程是否有问题等,具体内容如下#!/usr
  • 本文实例为大家分享了python实现nao机器人身体躯干和腿部动作的具体代码,供大家参考,具体内容如下跟上一篇类似,代码没什么难度,可以进行
手机版 网络编程 asp之家 www.aspxhome.com