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实现倒计时的示例
Feb 14 Python
Python标准库之随机数 (math包、random包)介绍
Nov 25 Python
在Python中编写数据库模块的教程
Apr 29 Python
python实现线程池的方法
Jun 30 Python
Python实现的十进制小数与二进制小数相互转换功能
Oct 12 Python
python使用xpath中遇到:到底是什么?
Jan 04 Python
详解Django中六个常用的自定义装饰器
Jul 04 Python
django 实现电子支付功能的示例代码
Jul 25 Python
python实现从文件中读取数据并绘制成 x y 轴图形的方法
Oct 14 Python
浅谈python在提示符下使用open打开文件失败的原因及解决方法
Nov 30 Python
基于python生成英文版词云图代码实例
May 16 Python
Python应用自动化部署工具Fabric原理及使用解析
Nov 30 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数组删除元素示例
2014/03/21 PHP
PHP实现加强版加密解密类实例
2015/07/29 PHP
详谈PHP中public,private,protected,abstract等关键字的用法
2017/12/31 PHP
thinkphp 5框架实现登陆,登出及session登陆状态检测功能示例
2019/10/10 PHP
PHP调用接口API封装的例子
2019/10/11 PHP
Prototype Object对象 学习
2009/07/12 Javascript
基于jQuery实现的水平和垂直居中的div窗口
2011/08/08 Javascript
jQuery中is()方法用法实例
2015/01/06 Javascript
EsLint入门学习教程
2017/02/17 Javascript
Js自动截取字符串长度,添加省略号(……)的实现方法
2017/03/06 Javascript
移动端效果之IndexList详解
2017/10/20 Javascript
小程序实现留言板
2018/11/02 Javascript
详解Vue+ElementUI从零开始搭建自己的网站(一、环境搭建)
2019/04/30 Javascript
开发中常用的25个JavaScript单行代码(小结)
2019/06/28 Javascript
layui使用button按钮 点击出现弹层 弹层中加载表单的实例
2019/09/04 Javascript
使用JS监听键盘按下事件(keydown event)
2019/11/07 Javascript
[49:05]Newbee vs TNC 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python实现队列的方法
2015/05/26 Python
python之matplotlib学习绘制动态更新图实例代码
2018/01/23 Python
TensorFlow实现RNN循环神经网络
2018/02/28 Python
python读取Excel实例详解
2018/08/17 Python
详解Python3之数据指纹MD5校验与对比
2019/06/11 Python
set在python里的含义和用法
2019/06/24 Python
Python assert语句的简单使用示例
2019/07/28 Python
python 使用socket传输图片视频等文件的实现方式
2019/08/07 Python
Win10+GPU版Pytorch1.1安装的安装步骤
2019/09/27 Python
Ubuntu权限不足无法创建文件夹解决方案
2020/11/14 Python
详解Python之Scrapy爬虫教程NBA球员数据存放到Mysql数据库
2021/01/24 Python
使用HTML5的File实现base64和图片的互转
2013/08/01 HTML / CSS
总务岗位职责
2013/11/19 职场文书
商务会议邀请函
2014/01/09 职场文书
小学生手册家长评语
2014/04/16 职场文书
员工合理化建议书
2014/05/19 职场文书
2015年党建工作汇报材料
2015/06/25 职场文书
MySQL分区表实现按月份归类
2021/11/01 MySQL
Win11安装受阻怎么办? Windows11安装问题与解决方案汇总
2021/11/21 数码科技