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实现批量把SVG格式转成png、pdf格式的代码分享
Aug 21 Python
Numpy中矩阵matrix读取一列的方法及数组和矩阵的相互转换实例
Jul 02 Python
Python字典创建 遍历 添加等实用基础操作技巧
Sep 13 Python
PyCharm鼠标右键不显示Run unittest的解决方法
Nov 30 Python
python GUI实现小球满屏乱跑效果
May 09 Python
python实现接口并发测试脚本
Jun 25 Python
python basemap 画出经纬度并标定的实例
Jul 09 Python
wxPython窗体拆分布局基础组件
Nov 19 Python
对python中assert、isinstance的用法详解
Nov 27 Python
爬虫代理池Python3WebSpider源代码测试过程解析
Dec 20 Python
使用python实现下载我们想听的歌曲,速度超快
Jul 09 Python
Python3如何使用tabulate打印数据
Sep 25 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之对抗Web扫描器的脚本技巧
2008/10/01 PHP
仿Aspnetpager的一个PHP分页类代码 附源码下载
2012/10/08 PHP
PHP SOCKET编程详解
2015/05/22 PHP
Yii中CGridView实现批量删除的方法
2015/12/28 PHP
PHP的mysqli_stmt_init()函数讲解
2019/01/24 PHP
PHP date()格式MySQL中插入datetime方法
2019/01/29 PHP
php无限极分类实现方法分析
2019/07/04 PHP
php进行md5加密简单实例方法
2019/09/19 PHP
Prototype使用指南之selector.js说明
2008/10/26 Javascript
createElement动态创建HTML对象脚本代码
2008/11/24 Javascript
FLASH 广告之外的链接
2008/12/16 Javascript
javascript div 弹出可拖动窗口
2009/02/26 Javascript
js 通用javascript函数库整理
2011/08/14 Javascript
Jquery显示和隐藏元素或设为只读(含Ligerui的控件禁用,实例说明介绍)
2013/07/09 Javascript
javascript检查表单数据是否改变的方法
2013/07/30 Javascript
分享33个jQuery与CSS3实现的绚丽鼠标悬停效果
2014/12/15 Javascript
JS实现仿google、百度搜索框输入信息智能提示的实现方法
2015/04/20 Javascript
iPhone手机上搭建nodejs服务器步骤方法
2015/07/06 NodeJs
AngularJS 事件发布机制
2018/08/28 Javascript
Vue列表如何实现滚动到指定位置样式改变效果
2020/05/09 Javascript
python转换摩斯密码示例
2014/02/16 Python
Python实现各种排序算法的代码示例总结
2015/12/11 Python
Python基于回溯法子集树模板解决野人与传教士问题示例
2017/09/11 Python
Python自定义简单图轴简单实例
2018/01/08 Python
python实现对求解最长回文子串的动态规划算法
2018/06/02 Python
python查看模块安装位置的方法
2018/10/16 Python
如何安装2019Pycharm最新版本(详细教程)
2019/09/26 Python
利用CSS3的flexbox实现水平垂直居中与三列等高布局
2016/09/12 HTML / CSS
让IE9以下版本的浏览器兼容HTML5的方法
2014/03/12 HTML / CSS
日本运动品牌美津浓官方购物网站:MIZUNO SHOP
2016/08/21 全球购物
采用冷却技术的超自然舒适度:GhostBed床垫
2018/09/18 全球购物
华为菲律宾官方网站:HUAWEI Philippines
2021/02/23 全球购物
"引用"与指针的区别是什么
2016/09/07 面试题
学年自我鉴定范文
2013/10/01 职场文书
师范生见习自我总结
2015/06/23 职场文书
小学三年级数学教学反思
2016/02/16 职场文书