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中变量的拷贝和作用域问题
May 05 Python
python中set()函数简介及实例解析
Jan 09 Python
Python实现将json文件中向量写入Excel的方法
Mar 26 Python
对pandas replace函数的使用方法小结
May 18 Python
Python3模拟curl发送post请求操作示例
May 03 Python
Python 实现数据结构-循环队列的操作方法
Jul 17 Python
使用django的ORM框架按月统计近一年内的数据方法
Jul 18 Python
python支持多线程的爬虫实例
Dec 21 Python
Python交互环境下打印和输入函数的实例内容
Feb 16 Python
django ORM之values和annotate使用详解
May 19 Python
PyQt5中QSpinBox计数器的实现
Jan 18 Python
python如何在word中存储本地图片
Apr 07 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 中的批处理的实现
2007/06/14 PHP
PHP实现中文圆形印章特效
2015/06/19 PHP
在php中设置session用memcache来存储的方法总结
2016/01/14 PHP
Zend Framework动作助手Json用法实例分析
2016/03/05 PHP
使用PHPStorm+XDebug搭建单步调试环境
2017/11/19 PHP
ThinkPHP 3.2.3实现加减乘除图片验证码
2018/12/05 PHP
javascript对象的property和prototype是这样一种关系
2007/03/24 Javascript
Javascript 强制类型转换函数
2009/05/17 Javascript
统计出现最多的字符次数的js代码
2010/12/03 Javascript
actionscript与javascript的区别
2011/05/25 Javascript
js split 的用法和定义 js split分割字符串成数组的实例代码
2012/05/13 Javascript
Jquery异步提交表单代码分享
2015/03/26 Javascript
关于事件mouseover ,mouseout ,mouseenter,mouseleave的区别
2015/10/12 Javascript
jquery ztree异步搜索(搜叶子)实践
2016/02/25 Javascript
利用BootStrap弹出二级对话框的简单实现方法
2016/09/21 Javascript
学习JavaScript图片预加载模块
2016/11/07 Javascript
babel基本使用详解
2017/02/17 Javascript
SpringBoot+Vue开发之Login校验规则、实现登录和重置事件
2020/10/19 Javascript
numpy数组之存取文件的实现示例
2019/05/24 Python
Python 文件操作之读取文件(read),文件指针与写入文件(write),文件打开方式示例
2019/09/29 Python
Django 实现xadmin后台菜单改为中文
2019/11/15 Python
PyCharm License Activation激活码失效问题的解决方法(图文详解)
2020/03/12 Python
通过css3动画和opacity透明度实现呼吸灯效果
2019/08/09 HTML / CSS
CSS3田字格列表的样式编写方法
2018/11/22 HTML / CSS
HTML5 Blob对象的具体使用
2020/05/22 HTML / CSS
世界上最大的街头服饰网站:Karmaloop
2017/02/04 全球购物
德国EGOIST网店:销售畅销的设计师品牌
2017/04/18 全球购物
遗体告别仪式主持词
2014/03/20 职场文书
三万活动总结
2014/04/28 职场文书
社团活动总结报告
2014/06/27 职场文书
授权委托书
2014/09/17 职场文书
质量保证书格式模板
2015/02/27 职场文书
运动会新闻报道稿
2015/07/22 职场文书
人为什么会“幸灾乐祸”?
2019/08/06 职场文书
Nginx域名转发https访问的实现
2021/03/31 Servers
mysql死锁和分库分表问题详解
2021/04/16 MySQL