Python内置函数语言环境示例:动态变量创建和访问以及应用场景
- 神奇的本地函数包括动态变量创建、动态变量访问和应用场景。
相同属性不相邻问题
需求:有两个列表,分别是list1和list2。 list1中有n个对象,每个对象有5个属性。属性之一是时间。 List1 必须按时间排序。相邻对象的时间不能重复。 m为唯一次数,m是不确定的。 list2 存储所有可能的时间情况。
- list1 = [task1,task2,task3…task]
- list2 = [time1,time2,time3…timem] (m
神奇局部函数
python语言很好地帮助我们解决了这个问题:内置本地函数动态创建变量
这里本地函数的作用:
- - 1. 根据传入的参数动态创建变量
- - 2. 根据传入的参数动态访问变量
demo
def apart_program_by_task(list1,list2): list_all_pro = [] #动态创建m个list,命名为'list'+str(tidm) for i in list2: locals()['list'+str(i)] = [] #拿到每个对象,获取其tid的值,通过拼接变量名访问对应的list,并把该对象加入该list for i in list1: locals()['list'+str(i.tid)].append(i) #循环访问m个list的每个list的头元素,并删除,然后加入list_all_pro while 1: flag = False for i in list2: try: pro = locals()['lst'+str(i)].pop() list_all_pro.append(pro) flag = True except: pass if flag == False: break return list_all_pro
在这个demo中,我们可以灵活地根据list2的长度动态创建len(list2)列表,然后根据拼接变量名访问各个列表,按时间进行分类。
回收完所有列表后我们在创建列表的时候,也是通过拼接变量名来逐一访问每个列表,添加新列表的第一个元素,保证新列表中相邻对象的时间不同。
更多
为什么局部函数变量可以动态创建和访问这里首先要介绍Python命名空间
- 局部命名空间local:每个函数自己的命名空间,记录了函数的参数和局部变量。
- 全局命名空间:每个A模块自己的命名空间为导入的模块注册函数、类、变量和常量。
- 命令空间创建顺序:
Python解释器启动 -> 创建原生命名空间 -> 加载模块 -> 创建全局命名空间 -> 调用函数 -> 创建本地命名空间
而 locals 的作用,就是以字典的形式返回当前函数中的变量名和变量值,例如:
def func(a = 1): b = 2 print(locals()) return a+b func() # {'b': 2, 'a': 1}
这可以解释动态访问变量的原理,就像访问字典一样。比如我们要根据key来访问字典的value,只需要
dict = {'b': 2, 'a': 1} print(dict["b"])
,那么,locals()[variablename]
就可以在当前函数中动态访问变量名,而locals()["list101"] = []也可以动态创建数组,相当于list101 = []
但是locals只能访问函数内部的变量,不能更改。要访问或修改全局变量,必须使用 globals 函数。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。