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中使用glob和rmtree删除目录子目录及所有文件的例子
Nov 21 Python
Python中常见的数据类型小结
Aug 29 Python
python中requests小技巧
May 10 Python
Django实现简单分页功能的方法详解
Dec 05 Python
python实现转盘效果 python实现轮盘抽奖游戏
Jan 22 Python
解决python打不开文件(文件不存在)的问题
Feb 18 Python
python3 图片 4通道转成3通道 1通道转成3通道 图片压缩实例
Dec 03 Python
Python反爬虫伪装浏览器进行爬虫
Feb 28 Python
Python验证码截取识别代码实例
May 16 Python
anaconda升级sklearn版本的实现方法
Feb 22 Python
Python捕获、播放和保存摄像头视频并提高视频清晰度和对比度
Apr 14 Python
python数字图像处理之图像自动阈值分割示例
Jun 28 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 Undefined index报错的修复方法
2011/07/17 PHP
脚本之家贴图转换+转贴工具用到的js代码超级推荐
2007/04/05 Javascript
Javascript 检测、添加、移除样式(className)函数代码
2009/09/08 Javascript
在Node.js中实现文件复制的方法和实例
2014/06/05 Javascript
JS判断变量是否为空判断是否null
2014/07/25 Javascript
javascript编写实用的省市选择器
2015/02/12 Javascript
使用JSON作为函数的参数的优缺点
2016/10/27 Javascript
vue中的计算属性的使用和vue实例的方法示例
2017/12/04 Javascript
关于react中组件通信的几种方式详解
2017/12/10 Javascript
详解使用vue-admin-template的优化历程
2018/05/20 Javascript
VueJS 组件参数名命名与组件属性转化问题
2018/12/03 Javascript
利用Vconsole和Fillder进行移动端抓包调试方法
2019/03/05 Javascript
2019最新21个MySQL高频面试题介绍
2020/02/06 Javascript
ajax jquery实现页面某一个div的刷新效果
2021/03/04 jQuery
python实现简单点对点(p2p)聊天
2017/09/13 Python
python实现定时自动备份文件到其他主机的实例代码
2018/02/23 Python
对python的文件内注释 help注释方法
2018/05/23 Python
python正则表达式之对号入座篇
2018/07/24 Python
Python找出微信上删除你好友的人脚本写法
2018/11/01 Python
关于HTML5你必须知道的28个新特性,新技巧以及新技术
2012/05/28 HTML / CSS
HTML5中input[type='date']自定义样式与日历校验功能的实现代码
2017/07/11 HTML / CSS
亚瑟士美国官网:ASICS美国
2017/02/01 全球购物
英国手工布艺沙发在线购买:Sofas & Stuff
2018/03/02 全球购物
非常详细的C#面试题集
2016/07/13 面试题
工艺工程师工作职责
2013/11/23 职场文书
高中考试作弊检讨书
2014/01/14 职场文书
校庆筹备方案
2014/03/30 职场文书
银行进社区活动总结
2014/07/07 职场文书
竞选班干部演讲稿600字
2014/08/20 职场文书
人民调解协议书范本
2014/10/11 职场文书
2014年银行工作总结范文
2014/11/12 职场文书
劳动争议和解协议书范本
2014/11/20 职场文书
2015年安全生产管理工作总结
2015/05/25 职场文书
煤矿施工安全协议书
2016/03/22 职场文书
新手入门Mysql--sql执行过程
2021/06/20 MySQL
vue中控制mock在开发环境使用,在生产环境禁用方式
2022/04/06 Vue.js