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实现遍历数据库并获取key的值
May 17 Python
Python基于sklearn库的分类算法简单应用示例
Jul 09 Python
python 通过麦克风录音 生成wav文件的方法
Jan 09 Python
python浪漫表白源码
Apr 05 Python
pandas的连接函数concat()函数的具体使用方法
Jul 09 Python
解决django后台管理界面添加中文内容乱码问题
Nov 15 Python
python程序输出无内容的解决方式
Apr 09 Python
Python检测端口IP字符串是否合法
Jun 05 Python
如何用Matplotlib 画三维图的示例代码
Jul 28 Python
Ubuntu权限不足无法创建文件夹解决方案
Nov 14 Python
Anaconda安装pytorch和paddle的方法步骤
Apr 03 Python
Elasticsearch 索引操作和增删改查
Apr 19 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
也谈截取首页新闻 - 范例
2006/10/09 PHP
php 将bmp图片转为jpg等其他任意格式的图片
2009/06/21 PHP
ThinkPHP3.1的Widget新用法
2014/06/19 PHP
微信公众平台DEMO(PHP)
2016/05/04 PHP
Expandable "Detail" Table Rows
2007/08/29 Javascript
Jquery公告滚动+AJAX后台得到数据
2011/04/14 Javascript
nodejs的10个性能优化技巧
2014/07/15 NodeJs
jQuery中:first-child选择器用法实例
2014/12/31 Javascript
JS+CSS实现实用的单击输入框弹出选择框的方法
2015/02/28 Javascript
快速解决js中window.location.href不工作的问题
2016/11/02 Javascript
js获取浏览器和屏幕的各种宽度高度
2017/02/22 Javascript
JS实现动态添加DOM节点和事件的方法示例
2017/04/28 Javascript
JS中offset和匀速动画详解
2018/02/06 Javascript
webpack+vue-cli项目中引入外部非模块格式js的方法
2018/09/28 Javascript
Vue.js中provide/inject实现响应式数据更新的方法示例
2019/10/16 Javascript
JQuery使用属性addClass、removeClass和toggleClass实现增加和删除类操作示例
2019/11/18 jQuery
jQuery 移除事件的方法
2020/06/20 jQuery
vue中实现拖动调整左右两侧div的宽度的示例代码
2020/07/22 Javascript
vue实现表格合并功能
2020/12/01 Vue.js
[15:58]DOTA2国际邀请赛采访专栏:Tongfu.Sansheng&KingJ,DK.rOtk
2013/08/08 DOTA
Python中绑定与未绑定的类方法用法分析
2016/04/29 Python
利用python发送和接收邮件
2016/09/27 Python
python3实现UDP协议的服务器和客户端
2017/06/14 Python
简单了解python模块概念
2018/01/11 Python
Python实现的自定义多线程多进程类示例
2018/03/23 Python
浅谈python图片处理Image和skimage的区别
2019/08/04 Python
python Qt5实现窗体跟踪鼠标移动
2019/12/13 Python
如何打包Python Web项目实现免安装一键启动的方法
2020/05/21 Python
pytorch  网络参数 weight bias 初始化详解
2020/06/24 Python
美国宠物商店:Wag.com
2016/10/25 全球购物
美国狗旅行和户外用品领先供应商:kurgo
2020/08/18 全球购物
Java基础知识面试要点
2016/07/29 面试题
毕业生的自我评价分享
2013/12/18 职场文书
会务接待方案
2014/02/27 职场文书
小学节能减排倡议书
2014/05/15 职场文书
一般基层干部群众路线教育实践活动个人对照检查材料
2014/11/04 职场文书