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实现统计单词出现的个数
May 28 Python
Python的装饰器用法学习笔记
Jun 24 Python
Python冒泡排序注意要点实例详解
Sep 09 Python
Python使用Matplotlib模块时坐标轴标题中文及各种特殊符号显示方法
May 04 Python
python实现音乐下载的统计
Jun 20 Python
深入flask之异步非堵塞实现代码示例
Jul 31 Python
Python绘图实现显示中文
Dec 04 Python
pandas中的数据去重处理的实现方法
Feb 10 Python
Python中import导入不同目录的模块方法详解
Feb 18 Python
tensorflow实现残差网络方式(mnist数据集)
May 26 Python
OpenCV图片漫画效果的实现示例
Aug 18 Python
python办公自动化之excel的操作
May 23 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中一些可能会被忽略的问题
2013/06/21 PHP
领悟php接口中interface存在的意义
2013/06/27 PHP
php使用CURL伪造IP和来源实例详解
2015/01/15 PHP
CodeIgniter表单验证方法实例详解
2016/03/03 PHP
php执行多个存储过程的方法【基于thinkPHP】
2016/11/08 PHP
Mootools 1.2教程 滚动条(Slider)
2009/09/15 Javascript
jQuery 美元符冲突的解决方法
2010/03/28 Javascript
js querySelector和getElementById通过id获取元素的区别
2012/04/20 Javascript
浅析node.js中close事件
2014/11/26 Javascript
JavaScript严格模式详解
2015/11/18 Javascript
JavaScript实现图片滑动切换的代码示例分享
2016/03/06 Javascript
全面理解JavaScript中的继承(必看)
2016/06/16 Javascript
BootStrap+Angularjs+NgDialog实现模式对话框
2016/08/24 Javascript
浅析Jquery操作select
2016/12/13 Javascript
React Native如何消除启动时白屏的方法
2017/08/08 Javascript
Angular2学习笔记之数据绑定的示例代码
2018/01/03 Javascript
jQuery实现网页拼图游戏
2020/04/22 jQuery
vue刷新页面时去闪烁提升用户体验效果的实现方法
2018/12/10 Javascript
常见的浏览器存储方式(cookie、localStorage、sessionStorage)
2019/05/07 Javascript
javascript(基于jQuery)实现鼠标获取选中的文字示例【测试可用】
2019/10/26 jQuery
javascript实现点击产生随机图形
2021/01/25 Javascript
[01:32:10]NAVI vs VG Supermajor 败者组 BO3 第一场 6.5
2018/06/06 DOTA
Python实现线程状态监测简单示例
2018/03/28 Python
python随机数分布random测试
2018/08/27 Python
python利用thrift服务读取hbase数据的方法
2018/12/27 Python
浅谈Pycharm中的Python Console与Terminal
2019/01/17 Python
Scrapy-Redis结合POST请求获取数据的方法示例
2019/05/07 Python
Python 函数绘图及函数图像微分与积分
2019/11/20 Python
python统计字符的个数代码实例
2020/02/07 Python
最新PyCharm 2020.2.3永久激活码(亲测有效)
2020/11/26 Python
HTML5制作3D爱心动画教程 献给女友浪漫的礼物
2014/11/05 HTML / CSS
中英文自我评价语句
2013/12/20 职场文书
冬季安全检查方案
2014/05/23 职场文书
领导干部个人对照检查材料(群众路线)
2014/09/26 职场文书
学生检讨书范文
2014/10/30 职场文书
酒店财务经理岗位职责
2015/04/08 职场文书