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的urllib库提交WEB表单
Feb 24 Python
python list语法学习(带例子)
Nov 01 Python
Python中urllib2模块的8个使用细节分享
Jan 01 Python
python通过apply使用元祖和列表调用函数实例
May 26 Python
python实现壁纸批量下载代码实例
Jan 25 Python
Python cookbook(数据结构与算法)字典相关计算问题示例
Feb 18 Python
pycharm中成功运行图片的配置教程
Oct 28 Python
python无限生成不重复(字母,数字,字符)组合的方法
Dec 04 Python
wxPython窗体拆分布局基础组件
Nov 19 Python
Python 线性回归分析以及评价指标详解
Apr 02 Python
python语音识别指南终极版(有这一篇足矣)
Sep 09 Python
五分钟学会怎么用python做一个简单的贪吃蛇
Jan 12 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+mysql查询实现无限下级分类树输出示例
2016/10/03 PHP
php 变量引用与变量销毁机制详细介绍
2016/12/05 PHP
Js四则运算函数代码
2012/07/21 Javascript
jQuery建立一个按字母顺序排列的友好页面索引(兼容IE6/7/8)
2013/02/26 Javascript
offsetHeight在OnLoad中获取为0的现象
2013/07/22 Javascript
JS 实现导航栏悬停效果(续)
2013/09/24 Javascript
用js闭包的方法实现多点标注冒泡示例
2014/05/29 Javascript
node.js中的fs.exists方法使用说明
2014/12/17 Javascript
深入理解JavaScript系列(31):设计模式之代理模式详解
2015/03/03 Javascript
JS实现可展开折叠层的鼠标拖曳效果
2015/10/09 Javascript
js实现动态加载脚本的方法实例汇总
2015/11/02 Javascript
javascript动态添加checkbox复选框的方法
2015/12/23 Javascript
jQuery使用中可能被XSS攻击的一些危险环节提醒
2016/05/24 Javascript
AngularJS动态加载模块和依赖的方法分析
2016/11/08 Javascript
Javascript基于jQuery UI实现选中区域拖拽效果
2016/11/25 Javascript
基于React实现表单数据的添加和删除详解
2017/03/14 Javascript
JavaScript手风琴页面制作
2017/05/17 Javascript
vue通过点击事件读取音频文件的方法
2018/05/30 Javascript
socket io与vue-cli的结合使用的示例代码
2018/11/01 Javascript
Python编程入门的一些基本知识
2015/05/13 Python
新手如何快速入门Python(菜鸟必看篇)
2017/06/10 Python
python 解决tqdm模块不能单行显示的问题
2020/02/19 Python
TensorFlow使用Graph的基本操作的实现
2020/04/22 Python
.img/.hdr格式转.nii格式的操作
2020/07/01 Python
Python requests及aiohttp速度对比代码实例
2020/07/16 Python
野兽派官方旗舰店:THE BEAST 野兽派
2016/08/05 全球购物
在阿联酋购买翻新手机和平板电脑:Teckzu
2021/02/12 全球购物
解释下列WebService名词:WSDL、SOAP、UDDI
2012/06/22 面试题
班组长岗位职责范本
2014/01/05 职场文书
试用期转正鉴定评语
2014/01/27 职场文书
酒店副总经理岗位职责范本
2014/02/04 职场文书
秋季运动会广播稿
2014/02/22 职场文书
会计员岗位职责
2014/03/15 职场文书
理财计划书
2014/08/14 职场文书
2014年电话销售工作总结
2014/12/01 职场文书
红色经典观后感
2015/06/18 职场文书