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 切片和range()用法说明
Mar 24 Python
python中引用与复制用法实例分析
Jun 04 Python
搭建Python的Django框架环境并建立和运行第一个App的教程
Jul 02 Python
python 递归深度优先搜索与广度优先搜索算法模拟实现
Oct 22 Python
python实现简单的单变量线性回归方法
Nov 08 Python
Python使用ctypes调用C/C++的方法
Jan 29 Python
Python实现的排列组合、破解密码算法示例
Apr 12 Python
Django中间件基础用法详解
Jul 18 Python
Django连接数据库并实现读写分离过程解析
Nov 13 Python
利用python实现AR教程
Nov 20 Python
python实现删除列表中某个元素的3种方法
Jan 15 Python
解决python存数据库速度太慢的问题
Apr 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判断当前操作系统类型
2015/10/28 PHP
Smarty3配置及入门语法
2017/02/22 PHP
Laravel网站打开速度优化的方法汇总
2017/07/16 PHP
laravel-admin表单提交隐藏一些数据,回调时获取数据的方法
2019/10/08 PHP
IE中jscript/javascript的条件编译
2006/09/07 Javascript
picChange 图片切换特效的函数代码
2010/05/06 Javascript
Js 随机数产生6位数字
2010/05/13 Javascript
javascript里模拟sleep(两种实现方式)
2013/01/25 Javascript
jquery实现图片等比例缩放以及max-width在ie中不兼容解决
2013/03/21 Javascript
用javascript判断IE版本号简单实用且向后兼容
2013/09/11 Javascript
如何解决Jquery库及其他库之间的$命名冲突
2013/09/15 Javascript
实现51Map地图接口(示例代码)
2013/11/22 Javascript
javascript 按键事件(兼容各浏览器)
2013/12/20 Javascript
js实现图片无缝滚动特效
2020/03/19 Javascript
使用Sticky组件实现带sticky效果的tab导航和滚动导航的方法
2016/03/22 Javascript
很棒的Bootstrap选项卡切换效果
2016/07/01 Javascript
jQuery加载及解析XML文件的方法实例分析
2017/01/22 Javascript
nodejs搭建本地服务器并访问文件的方法
2017/03/03 NodeJs
js中json对象和字符串的理解及相互转化操作实现方法
2017/09/22 Javascript
vue .sync修饰符的使用详解
2018/06/15 Javascript
解决koa2 ctx.render is not a function报错问题
2018/08/07 Javascript
bootstrap与pagehelper实现分页效果
2018/12/29 Javascript
Vue按时间段查询数据组件使用详解
2020/08/21 Javascript
探究数组排序提升Python程序的循环的运行效率的原因
2015/04/01 Python
python获取url的返回信息方法
2018/12/17 Python
python中numpy数组与list相互转换实例方法
2021/01/29 Python
英国地毯卖家:The Rug Seller
2019/07/18 全球购物
俄罗斯披萨、寿司和面食送货到家服务:2 Берега
2019/12/15 全球购物
如何利用find命令查找文件
2016/11/18 面试题
会计实习期自我鉴定
2013/10/06 职场文书
关于打架的检讨书
2014/01/17 职场文书
舞蹈兴趣小组活动总结
2014/07/07 职场文书
环境科学专业教师求职信
2014/07/12 职场文书
销售2014年度工作总结
2014/12/08 职场文书
加薪通知
2015/04/25 职场文书
高中班主任心得体会
2016/01/07 职场文书