动态变量名赋值

在使用 tkinter 时需要动态生成变量,如动态生成 var1…var10 变量。

使用 exec 动态赋值

exec 在 python3 中是内置函数,它支持 python 代码的动态执行。

for i in range(6):

exec('var{} = {}'.format(i,i))

print(var0,var1,var2,var3,var4,var5)

运行结果如下:

0,1,2,3,4,5

利用命名空间动态赋值

在 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 是一个词典,键为属性名,值对应属性的值。

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.__dict__)

print(t.n0,t.n1,t.n2,t.n3,t.n4)

运行结果如下:

{'n0': 0, 'n1': 1, 'n2': 2, 'n3': 3, 'n4': 4}

0 1 2 3 4

利用 exec 函数

同样地,可以使用 exec 调用变量

for i in range(5):

exec('var{} = {}'.format(i, i))

for i in range(5):

exec('print(var{},end=" ")'.format(i))

运行结果如下:

0 1 2 3 4

利用命名空间

因为命令空间的 locals() 与 globals() 均会返回一个字典,利用字典的 get 方法获取变量的值。

for i in range(5):

exec('var{} = {}'.format(i, i))

names = locals()

for i in range(5):

print(names.get('var' + str(i)),end=' ')

运行结果如下:

0 1 2 3 4

你想在使用范围内执行某个代码片段,并且希望在执行后所有的结果都不可见。

>>> a = 14

>>> exec('b = a + 1')

>>> print(b)

15

在一个函数中执行同样的代码:(会发生错误)

>>> def test():

... a = 14

... exec('b = a + 1')

... print(b)

...

>>> test()

Traceback (most recent call last):

File "", line 1, in

File "", line 4, in test

NameError: global name 'b' is not defined

>>>

可以看出,最后抛出了一个NameError异常,就跟在 exec() 语句从没执行过一样。要是你想在后面的计算中使用到 exec() 执行结果的话就会有问题了。

为了修正这样的错误,你需要在调用 exec() 之前使用 locals() 函数来得到一个局部变量字典。

之后你就能从局部字典中获取修改过后的变量值了。例如:

>>> def test():

... a = 13

... loc = locals()

... exec('b = a + 1')

... b = loc['b']

... print(b)

...

>>> test()

14

>>>

注意点:

默认情况下,exec() 会在调用者局部和全局范围内执行代码。然而,在函数里面,传递给 exec() 的局部范围是拷贝实际局部变量组成的一个字典。

因此,如果 exec() 如果执行了修改操作,这种修改后的结果对实际局部变量值是没有影响的。

>>> def test1():

... x = 0

... exec('x += 1')

... print(x)

...

>>> test1()

0

上面代码里,当你调用 locals() 获取局部变量时,你获得的是传递给 exec() 的局部变量的一个拷贝。

通过在代码执行后审查这个字典的值,那就能获取修改后的值了。

>>> def test2():

... x = 0

... loc = locals()

... print('before:', loc)

... exec('x += 1')

... print('after:', loc)

... print('x =', x)

...

>>> test2()

before: {'x': 0}

after: {'loc': {...}, 'x': 1}

x = 0

>>>

仔细观察最后一步的输出,除非你将 loc 中被修改后的值手动赋值给x,否则x变量值是不会变的。

在使用 locals() 的时候,你需要注意操作顺序。每次它被调用的时候,locals() 会获取局部变量值中的值并覆盖字典中相应的变量。

>>> def test3():

... x = 0

... loc = locals()

... print(loc)

... exec('x += 1')

... print(loc)

... locals()

... print(loc)

...

>>> test3()

{'x': 0}

{'loc': {...}, 'x': 1}

{'loc': {...}, 'x': 0}

>>>

注意最后一次调用 locals() 的时候x的值是如何被覆盖掉的。

作为 locals() 的一个替代方案,你可以使用你自己的字典,并将它传递给 exec() 。例如:

>>> def test4():

... a = 13

... loc = { 'a' : a }

... glb = { }

... exec('b = a + 1', glb, loc)

... b = loc['b']

... print(b)

...

>>> test4()

14

>>>

大部分情况下,这种方式是使用 exec() 的最佳实践。你只需要保证全局和局部字典在后面代码访问时已经被初始化。

python自定义变量名_Python 动态变量名定义与调用相关推荐

  1. Python编程基础:实验5——函数定义与调用

    Python编程基础:实验5--函数定义与调用 文章目录 Python编程基础:实验5--函数定义与调用 一.前言 二.我的环境 三.实验目的与要求 四.实验任务 1.程序填空 2.程序编程 五.最后 ...

  2. python自定义变量名有哪些_Python学习第161课——自定义变量和导出变量

    我们之前介绍过,Linux系统的命令相当于一个变量,这个变量是保存在系统的环境变量里面的. 我们在shell中输入env并回车,就会显示出系统的所有环境变量,如下图: 如上图所示,我们在环境变量中可以 ...

  3. python自定义变量名标识符,【python】3 标识符和关键字

    3 标识符和关键字 3.1 标识符 3.1.1 标识符的定义 开发人员在程序中自定义的一些符合和名称,例如变量名和函数名. 3.1.2 标识符定义的规则 标识符:字母/数字/下划线组成,且数字不能开头 ...

  4. python动态变量名以及调用_Python 动态变量名与调用介绍

    Python是一种计算机程序设计语言.是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell). 动态变量名赋值 在使用 tkinter 时需要动态生成变量,如动态生成 var1... ...

  5. python自定义修饰器_Python概述

    #Version 3.0 本章主要解决:为什么学Python,Python是什么样的语言,怎么学Python,怎样做老庄才给你及格或优秀. 一.为什么学Python 学习编程要比学习英语更重要,因为编 ...

  6. python中span函数_Python中函数定义及参数实例

    1.函数定义函数就是完成特定功能的一个语句组,这组语句可以作为一个单位使用,并且给它取一个名字 ,可以通过函数名在程序的不同地方多次执行(这通常叫函数调用) 预定义函数(可以直接使用) 自定义函数(自 ...

  7. python 声明变量类型_python基础学习03数据类型和变量

    数据类型和变量 1. 数据类型 1.1 整数 Python中不限制整数正负及大小,例如:1,-1,100,-100等等.计算机常用十进制和十六进制表示数值,比如十六进制表示方法是用前缀0x加后缀0-9 ...

  8. python自定义函数参数_python自定义函数的参数之四种表现形式

    (1)def a(x,y):print x,y 这是最常见的定义方式,调用该函数,a(1,2)则x取1,y取2,形参与实参相对应,如果a(1)或者a(1,2,3)则会报错 (2)def a(x,y=3 ...

  9. python公共变量声明_Python变量声明

    繁星coding 好的,首先要做的事情.Python中没有"变量声明"或"变量初始化"这样的东西.简直就是我们所谓的"任务",但应该只是称之 ...

最新文章

  1. 微信开发之连接数据库
  2. 【原创】Aspose.Words组件介绍及使用—基本介绍与DOM概述
  3. [译]Javascript数列的push和pop方法
  4. java中集合的排序_Java中集合排序的两种方法
  5. SpringData ElasticSearch入门案例
  6. 赵平C语言,赵平智与OIOIC
  7. 工资7500但没社保公积金,和工资4500但福利很好,这两份工作怎么选择?
  8. java 线程等待队列_Java多线程学习(五)——等待通知机制
  9. ESP8266WIFI模块了解一下(新手入门级别)
  10. Windows和Mac下的_stdcall
  11. 2022年版中国石油焦市场运行现状调研与前景动态分析报告
  12. Android 13中的 Open Mobile API
  13. Elasticsearch: collapse 去重
  14. c语言分段函数x2-sinx,大学高等数学: 第二章第五讲三种分段函数求导法, 再也不担心了...
  15. Xposed框架Xposed安装器|Xposed for Android 5.0/5.1/6.0|详细安装教程
  16. 金蝶KIS软件操作小技巧
  17. 大公司病,太TM形象了!
  18. 点成分享 | 蛋白质浓度测定之BCA法
  19. 苹果切换输入法_轻松搞定缅甸语手机输入法(苹果篇)
  20. BATJ大数据架构师带你领略实时计算框架Flink的魅力!

热门文章

  1. try catch用法_synchronized用法总结
  2. 容器源码分析之TreeSet(五)
  3. Python类的结构及属性的获取机制
  4. 【传智播客】Javaweb程序设计任务教程 黑马程序员 第三章 课后答案
  5. Happens-Before的7个规则
  6. php 1 打印出来,php 怎么强制打印错误
  7. 超声波测距的数据应该如何显示到七针oled上_一文读懂京东方、TCL华星、三星显示和LGD之间的复杂关系...
  8. Java和C/C++程序实时通讯数据移植问题的研究
  9. linux内核替换图片,linux内核替换 - magic_吕伟的个人空间 - OSCHINA - 中文开源技术交流社区...
  10. java mapper control_java spring boot中怎么编写mapper?怎么编写service和controller?