美文网首页python自学
神奇的python内置函数locals

神奇的python内置函数locals

作者: BigCola_Lee | 来源:发表于2018-07-10 15:23 被阅读4次

    摘要

    • 本文我们介绍神奇的locals函数,包括动态创建变量和动态访问变量,以及一个应用场景。

    相同属性不相邻问题

    需求:有两个list,分别为list1和list2。list1中有n个对象,每个对象有5个属性,其中一个属性是tid,要求list1按tid排序,相邻的对象的tid不能重复,m为不重复的tid数量,m不确定。list2存放的是所有可能出现的tid的情况。

    list1 = [task1,task2,task3...taskn]
    list2 = [tid1,tid2,tid3...tidm] (m<n,且m不确定)

    需求分析:对于上述需求,我们想到的思路是先把所有对象按tid这个属性分为m个list,相同的tid在同一个list中,然后挨个取出并删除这m个list的头元素,并存到新的list中。

    但是由于m在运行程序前不确定,我们只能在运行程序时获取到m的确切数字,然后创建m个list,这就涉及到了动态创建变量。

    神奇的local函数

    python语言很好的帮我们解决了这个问题:利用locals内置函数动态创建变量。

    locals函数在这里的作用:

    • 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)个list,然后根据拼接变量名访问每个list,从而做到按tid归类。

    在回收所有的list时,我们也是通过拼接变量名挨个访问每个list一次,取到头元素加入新的list,来保证新的list中的相邻对象的tid不相同。

    更多

    为什么locals函数可以动态创建和访问变量,这里我们必须先介绍python的命名空间。

    • 局部命名空间local:每个函数自己的命名空间,记录函数的参数和局部变量。

    • 全局命名空间global:每个模块自己的命名空间,记录了函数、类、导入的模块的变量以及常量。

    • 命令空间创建顺序:

      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函数。

    相关文章

      网友评论

        本文标题:神奇的python内置函数locals

        本文链接:https://www.haomeiwen.com/subject/emafpftx.html