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的web.py框架实现类似Django的ORM查询的教程
May 02 Python
Python编程入门之Hello World的三种实现方式
Nov 13 Python
Python cookbook(数据结构与算法)将多个映射合并为单个映射的方法
Apr 19 Python
Django如何配置mysql数据库
May 04 Python
实践Vim配置python开发环境
Jul 02 Python
解决python测试opencv时imread导致的错误问题
Jan 26 Python
Pytorch训练过程出现nan的解决方式
Jan 02 Python
python对象销毁实例(垃圾回收)
Jan 16 Python
Python 文件数据读写的具体实现
Jan 24 Python
Django 自定义404 500等错误页面的实现
Mar 08 Python
jupyter实现重新加载模块
Apr 16 Python
Python 中的Sympy详细使用
Aug 07 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
swfupload 多文件上传实现代码
2008/08/27 PHP
php 中英文语言转换类代码
2011/08/11 PHP
php htmlspecialchars()与shtmlspecialchars()函数的深入分析
2013/06/05 PHP
php使用MySQL保存session会话的方法
2015/06/18 PHP
PHP经典实用正则表达式小结
2017/05/04 PHP
解决FireFox下[使用event很麻烦]的问题
2006/11/26 Javascript
静态页面下用javascript操作ACCESS数据库(读增改删)的代码
2007/05/14 Javascript
子窗口、父窗口和Silverlight之间的相互调用
2010/08/16 Javascript
javascript字符串拼接的效率问题
2010/12/25 Javascript
关于递归运算的顺序测试代码
2011/11/30 Javascript
利用函数的惰性载入提高javascript代码执行效率
2014/05/05 Javascript
javascript实现10个球随机运动、碰撞实例详解
2015/07/08 Javascript
jQuery实现的点赞随机数字显示动画效果(附在线演示与demo源码下载)
2015/12/31 Javascript
Nodejs学习item【入门手上】
2016/05/05 NodeJs
js事件驱动机制 浏览器兼容处理方法
2016/07/23 Javascript
微信小程序技巧之show内容展示,上传文件编码问题
2017/01/23 Javascript
vue-router懒加载速度缓慢问题及解决方法
2018/11/25 Javascript
JS实现从对象获取对象中单个键值的方法示例
2019/06/05 Javascript
node.js中对Event Loop事件循环的理解与应用实例分析
2020/02/14 Javascript
[00:33]2016完美“圣”典风云人物:Sccc宣传片
2016/12/03 DOTA
一个简单的python程序实例(通讯录)
2013/11/29 Python
利用Python爬虫给孩子起个好名字
2017/02/14 Python
在django中使用自定义标签实现分页功能
2017/07/04 Python
Python3实现购物车功能
2018/04/18 Python
详解python之协程gevent模块
2018/06/14 Python
使用pygame实现垃圾分类小游戏功能(已获校级二等奖)
2020/07/23 Python
HTML5样式控制示例代码
2013/11/27 HTML / CSS
印度首个本地在线平台:nearbuy
2019/03/28 全球购物
免税水晶:Duty Free Crystal
2019/05/13 全球购物
报到证丢失证明
2014/01/11 职场文书
大学生2014全国两会学习心得体会
2014/03/10 职场文书
故意杀人罪辩护词
2015/05/21 职场文书
事业单位工作人员2015年度思想工作总结
2015/10/15 职场文书
解决tk mapper 通用mapper的bug问题
2021/06/16 Java/Android
python 字典和列表嵌套用法详解
2021/06/29 Python
Java面试题冲刺第十五天--设计模式
2021/08/07 面试题