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 调用DLL操作抄表机
Jan 12 Python
Python提示[Errno 32]Broken pipe导致线程crash错误解决方法
Nov 19 Python
举例区分Python中的浅复制与深复制
Jul 02 Python
浅谈对yield的初步理解
May 29 Python
TensorFlow搭建神经网络最佳实践
Mar 09 Python
python中format()函数的简单使用教程
Mar 14 Python
Python的numpy库中将矩阵转换为列表等函数的方法
Apr 04 Python
pip安装时ReadTimeoutError的解决方法
Jun 12 Python
Python 3.3实现计算两个日期间隔秒数/天数的方法示例
Jan 07 Python
通过实例学习Python Excel操作
Jan 06 Python
Python实现猜年龄游戏代码实例
Mar 25 Python
Python+OpenCV实现在图像上绘制矩形
Mar 21 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
第1次亲密接触PHP5(2)
2006/10/09 PHP
用PHP函数解决SQL injection
2006/10/09 PHP
PHP 在线翻译函数代码
2009/05/07 PHP
Joomla下利用configuration.php存储简单数据
2010/05/19 PHP
深入php socket的讲解与实例分析
2013/06/13 PHP
php 批量替换html标签的实例代码
2013/11/26 PHP
ThinkPHP内置jsonRPC的缺陷分析
2014/12/18 PHP
Linux操作系统安装LAMP环境
2015/06/26 PHP
php装饰者模式简单应用案例分析
2019/10/23 PHP
PHP上传图片到数据库并显示的实例代码
2019/12/20 PHP
Raphael一个用于在网页中绘制矢量图形的Javascript库
2013/01/08 Javascript
通过上下左右键和回车键切换光标实现代码
2013/03/08 Javascript
利用window.name实现windowStorage代码分享
2014/01/02 Javascript
常见JS验证脚本汇总
2015/12/01 Javascript
JS简单实现DIV相对于浏览器固定位置不变的方法
2016/06/17 Javascript
JS实现保留n位小数的四舍五入问题示例
2016/08/03 Javascript
CSS3 3D 技术手把手教你玩转
2016/09/02 Javascript
Jquery Easyui菜单组件Menu使用详解(15)
2016/12/18 Javascript
JavaScript中的遍历详解(多种遍历)
2017/04/07 Javascript
详解wow.js中各种特效对应的类名
2017/09/13 Javascript
Vue源码解读之Component组件注册的实现
2018/08/24 Javascript
React 组件中的 bind(this)示例代码
2018/09/16 Javascript
解决node终端下运行js文件不支持ES6语法
2020/04/04 Javascript
python pygame实现方向键控制小球
2019/05/17 Python
Python识别快递条形码及Tesseract-OCR使用详解
2019/07/15 Python
使用Python实现分别输出每个数组
2019/12/06 Python
python 爬取小说并下载的示例
2020/12/07 Python
Android本地应用打开方法——通过html5写连接
2016/03/11 HTML / CSS
意大利买卖二手奢侈品网站:LAMPOO
2020/06/03 全球购物
Linux的主要特性
2014/10/06 面试题
大学生标准自荐书
2014/06/15 职场文书
迎国庆演讲稿
2014/09/15 职场文书
劳模先进事迹材料
2014/12/24 职场文书
爱国主义电影观后感
2015/06/18 职场文书
python实现大文本文件分割成多个小文件
2021/04/20 Python
MySQL对数据表已有表进行分区表的实现
2021/11/01 MySQL