相同属性不相邻问题
需求:有两个list,分别为list1和list2。list1中有n个对象,每个对象有5个属性,其中一个属性是tid,要求list1按tid排序,相邻的对象的tid不能重复,m为不重复的tid数量,m不确定。list2存放的是所有可能出现的tid的情况。
神奇的local函数
python语言很好的帮我们解决了这个问题:利用locals内置函数动态创建变量。
locals函数在这里的作用:
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
|
python解释器启动 ->创建内建命名空间 -> 加载模块 -> 创建全局命名空间 ->函数被调用 ->创建局部命名空间
而locals的作用,就是以字典的形式,返回当前函数内变量名和变量值,比如:
def func(a = 1):
b = 2
print(locals())
return a+b
func() # {'b': 2, 'a': 1}
|
这就可以解释动态访问变量的原理了,就像访问字典一样,比如我们要根据key访问字典的值,只需要
dict = {'b': 2, 'a': 1}
print(dict["b"])
|
所以,locals()[变量名] 即可动态访问当前函数内的变量名,而locals()[“list101”] = [] 也可以动态创建数组,等价于 list101 = []
但是locals只能访问所在函数内部的变量,且不可修改,要访问全局变量or修改,则需要使用globals函数。