Python神奇的内置函数locals的实例讲解


Posted in Python onFebruary 22, 2019

摘要

  • 本文我们介绍神奇的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

神奇的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 相关文章推荐
python冒泡排序算法的实现代码
Nov 21 Python
简单上手Python中装饰器的使用
Jul 12 Python
flask session组件的使用示例
Dec 25 Python
使用python3实现操作串口详解
Jan 01 Python
python 利用文件锁单例执行脚本的方法
Feb 19 Python
python处理excel绘制雷达图
Oct 18 Python
图解python全局变量与局部变量相关知识
Nov 02 Python
python实现布隆过滤器及原理解析
Dec 08 Python
Django重设Admin密码过程解析
Feb 10 Python
Jupyter Notebook 文件默认目录的查看以及更改步骤
Apr 14 Python
浅析Python requests 模块
Oct 09 Python
如何用python绘制雷达图
Apr 24 Python
Python玩转Excel的读写改实例
Feb 22 #Python
Python操作配置文件ini的三种方法讲解
Feb 22 #Python
Python使用pymongo库操作MongoDB数据库的方法实例
Feb 22 #Python
python调用虹软2.0第三版的具体使用
Feb 22 #Python
Python实现图片转字符画的代码实例
Feb 22 #Python
Python中正则表达式的用法总结
Feb 22 #Python
python ddt数据驱动最简实例代码
Feb 22 #Python
You might like
PHP 命名空间实例说明
2011/01/27 PHP
php在线代理转向代码
2012/05/05 PHP
通过源码解析Laravel的依赖注入
2018/01/22 PHP
js关闭当前页面(窗口)的几种方式总结
2013/03/05 Javascript
js实现网页倒计时、网站已运行时间功能的代码3例
2014/04/14 Javascript
jQuery1.9.1针对checkbox的调整方法(prop)
2014/05/01 Javascript
动态加载jQuery的两种方法实例分析
2015/07/17 Javascript
简单了解Backbone.js的Model模型以及View视图的源码
2016/02/14 Javascript
JS工作中的小贴士之”闭包“与事件委托的”阻止冒泡“
2016/06/16 Javascript
关于react中组件通信的几种方式详解
2017/12/10 Javascript
实例学习JavaScript读取和写入cookie
2018/01/29 Javascript
nodejs中实现用户注册路由功能
2019/05/20 NodeJs
微信小程序 高德地图路线规划实现过程详解
2019/08/05 Javascript
[05:40]DOTA2荣耀之路6:Wings最后进攻
2018/05/30 DOTA
python模拟enum枚举类型的方法小结
2015/04/30 Python
Python抓取百度查询结果的方法
2015/07/08 Python
黑科技 Python脚本帮你找出微信上删除你好友的人
2016/01/07 Python
分享几道你可能遇到的python面试题
2017/07/24 Python
Python使用os.listdir()和os.walk()获取文件路径与文件下所有目录的方法
2019/04/01 Python
对Django中的权限和分组管理实例讲解
2019/08/16 Python
Python中的特殊方法以及应用详解
2020/09/20 Python
python Xpath语法的使用
2020/11/26 Python
python中yield的用法详解
2021/01/13 Python
PurCotton全棉时代官网:100%天然棉花生产的生活护理用品
2016/11/18 全球购物
酒店管理毕业生自荐信
2013/10/24 职场文书
父亲追悼会答谢词
2014/01/17 职场文书
八项规定整改措施
2014/02/12 职场文书
暑假社会实践心得体会
2014/09/02 职场文书
戒毒悔改检讨书
2014/09/21 职场文书
庆六一宣传标语
2014/10/08 职场文书
党员作风建设自查报告
2014/10/23 职场文书
考试作弊检讨书怎么写?
2014/12/21 职场文书
团组织推荐意见
2015/06/05 职场文书
幼儿园毕业典礼家长致辞
2015/07/29 职场文书
解决numpy和torch数据类型转化的问题
2021/05/23 Python
javascript拖曳互换div的位置实现示例
2021/06/28 Javascript