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 截取 取出一部分的字符串方法
Mar 01 Python
python list元素为tuple时的排序方法
Apr 18 Python
python实现超市扫码仪计费
May 30 Python
Python+OpenCV图片局部区域像素值处理改进版详解
Jan 23 Python
对python 自定义协议的方法详解
Feb 13 Python
django框架使用orm实现批量更新数据的方法
Jun 21 Python
Pyinstaller 打包exe教程及问题解决
Aug 16 Python
python GUI库图形界面开发之PyQt5打开保存对话框QFileDialog详细使用方法与实例
Feb 27 Python
Python3.6 中的pyinstaller安装和使用教程
Mar 16 Python
Python基于数列实现购物车程序过程详解
Jun 09 Python
python中tkinter窗口位置\坐标\大小等实现示例
Jul 09 Python
pytorch 预训练模型读取修改相关参数的填坑问题
Jun 05 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
mysql5的sql文件导入到mysql4的方法
2008/10/19 PHP
计算php页面运行时间的函数介绍
2013/07/01 PHP
Laravel 5 框架入门(二)构建 Pages 的管理功能
2015/04/09 PHP
php 使用 __call实现重载功能示例
2019/11/18 PHP
用tip解决Ext列宽度不够的问题
2008/12/13 Javascript
javascript Ext JS 状态默认存储时间
2009/02/15 Javascript
一些经常会用到的Javascript检测函数
2010/05/31 Javascript
AngularJS的表单使用详解
2015/06/17 Javascript
jQuery实现页面顶部显示的进度条效果完整实例
2015/12/09 Javascript
AngularJS中的Directive实现延迟加载
2016/01/25 Javascript
Bootstrap表单组件教程详解
2016/04/26 Javascript
jQuery如何解决IE输入框不能输入的问题
2016/10/08 Javascript
node.js 抓取代理ip实例代码
2017/04/30 Javascript
jQuery实现模糊搜索功能的方法分析
2018/06/29 jQuery
JavaScript判断对象和数组的两种方法
2019/05/31 Javascript
vue 图片裁剪上传组件的实现
2020/11/12 Javascript
[11:42]2018DOTA2国际邀请赛寻真——OG卷土重来
2018/08/17 DOTA
Python实现将照片变成卡通图片的方法【基于opencv】
2018/01/17 Python
python运行时强制刷新缓冲区的方法
2019/01/14 Python
对Python协程之异步同步的区别详解
2019/02/19 Python
python+pyqt5编写md5生成器
2019/03/18 Python
Python向excel中写入数据的方法
2019/05/05 Python
Python 获取windows桌面路径的5种方法小结
2019/07/15 Python
使用Python打造一款间谍程序的流程分析
2020/02/21 Python
Django choices下拉列表绑定实例
2020/03/13 Python
解决keras使用cov1D函数的输入问题
2020/06/29 Python
HTML5本地数据库基础操作详解
2016/04/26 HTML / CSS
StubHub意大利:购买和出售全球演唱会和体育赛事门票
2017/11/21 全球购物
以特惠价提供在线奢侈品购物:FRMODA.com
2018/01/25 全球购物
写好求职应聘自荐信的三部曲
2013/09/21 职场文书
学期自我鉴定
2013/11/04 职场文书
感恩之星事迹材料
2014/05/03 职场文书
授权委托书(完整版)
2014/09/10 职场文书
逃课打麻将检讨书
2014/10/05 职场文书
如何用PHP实现多线程编程
2021/05/26 PHP
Redis入门教程详解
2021/08/30 Redis