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 version 2.7 required, which was not found in the registry
Aug 26 Python
python对html代码进行escape编码的方法
May 04 Python
Python抓取百度查询结果的方法
Jul 08 Python
Python3内置模块之base64编解码方法详解
Jul 13 Python
使用 Python 快速实现 HTTP 和 FTP 服务器的方法
Jul 22 Python
python excel转换csv代码实例
Aug 26 Python
Python time库基本使用方法分析
Dec 13 Python
Python vtk读取并显示dicom文件示例
Jan 13 Python
python如何求100以内的素数
May 27 Python
用python实现名片管理系统
Jun 18 Python
详解python datetime模块
Aug 17 Python
利用python进行数据加载
Jun 20 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中的PHP_EOL换行符详细解析
2013/10/26 PHP
基础的WordPress插件制作教程
2015/11/24 PHP
PHP信号量基本用法实例详解
2016/02/12 PHP
PHP mysqli事务操作常用方法分析
2017/07/22 PHP
Yii2框架中一些折磨人的坑
2019/12/15 PHP
基于jquery实现的表格分页实现代码
2011/06/21 Javascript
js实现连续英文字符自动换行兼容ie6 ie7和firefox
2013/09/06 Javascript
jquery 鼠标滑动显示详情应用示例
2014/01/24 Javascript
分享一个自己动手写的jQuery分页插件
2014/08/28 Javascript
关于动态执行代码(js的Eval)实例详解
2016/08/15 Javascript
Vuejs第十篇之vuejs父子组件通信
2016/09/06 Javascript
jquery插件bootstrapValidator表单验证详解
2016/12/15 Javascript
原生js仿淘宝网商品放大镜效果
2017/02/28 Javascript
Vue中对拿到的数据进行A-Z排序的实例
2018/09/25 Javascript
js获取url页面id,也就是最后的数字文件名
2020/09/25 Javascript
[01:42]辉夜杯战队访谈宣传片—FANTUAN
2015/12/25 DOTA
[47:45]DOTA2-DPC中国联赛 正赛 Phoenix vs Dragon BO3 第一场 2月26日
2021/03/11 DOTA
解决python文件字符串转列表时遇到空行的问题
2017/07/09 Python
Python内建模块struct实例详解
2018/02/02 Python
Django中反向生成models.py的实例讲解
2018/05/30 Python
python3的输入方式及多组输入方法
2018/10/17 Python
python学习开发mock接口
2019/04/28 Python
Python中字典与恒等运算符的用法分析
2019/08/22 Python
python 列表、字典和集合的添加和删除操作
2019/12/16 Python
Windows系统下pycharm中的pip换源
2020/02/23 Python
python实现字符串和数字拼接
2020/03/02 Python
Pycharm中安装wordcloud等库失败问题及终端通过pip安装的Python库如何添加到Pycharm解释器中(推荐)
2020/05/10 Python
Lookfantastic德国官网:英国知名美妆购物网站
2017/06/11 全球购物
StubHub美国:购买或出售您的门票
2019/07/09 全球购物
俄罗斯披萨、寿司和面食送货到家服务:2 Берега
2019/12/15 全球购物
银行存款证明样本
2014/01/17 职场文书
网络教育自我鉴定
2014/02/04 职场文书
党员干部批评与自我批评反四风思想汇报
2014/09/21 职场文书
2016年小学生寒假家长评语
2015/10/10 职场文书
2016关于军训的心得体会
2016/01/11 职场文书
Redis遍历所有key的两个命令(KEYS 和 SCAN)
2021/04/12 Redis