Python神奇的内置函数locals的实例讲解

 更新时间:2019年02月22日 16:36:30   作者:lk7688535  
今天小编就为大家分享一篇关于Python神奇的内置函数locals的实例讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

摘要

  • 本文我们介绍神奇的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爬取京东的商品分类与链接

    这篇文章主要介绍利用python爬取京东商品分类以及对应的连接,这个功能不是很复杂,没有爬取里面的隐藏的东西。算是给新手一个示例教程吧,有需要的可以参考借鉴。
    2016-08-08
  • Python中的JSON Pickle Shelve模块特性与区别实例探究

    Python中的JSON Pickle Shelve模块特性与区别实例探究

    在Python中,处理数据序列化和持久化是极其重要的,JSON、Pickle和Shelve是三种常用的模块,它们提供了不同的方法来处理数据的序列化和持久化,本文将深入研究这三个模块,探讨它们的特性、用法以及各自的优缺点
    2024-01-01
  • python将字典内容写入json文件的实例代码

    python将字典内容写入json文件的实例代码

    在本篇文章里小编给大家整理的是一篇关于python将字典内容写入json文件的实例代码,有需要的朋友们可以参考下。
    2020-08-08
  • python常用文件操作(读写追加等)

    python常用文件操作(读写追加等)

    在Python中,文件操作是一项常用的任务,本节将介绍如何执行基本的文件操作,如读取、写入和追加数据,我们将通过实例代码详细讲解每个知识点
    2023-06-06
  • 使用Python初始化多维列表遇到的问题详解

    使用Python初始化多维列表遇到的问题详解

    这篇文章主要介绍了使用Python初始化多维列表遇到的问题详解,二维列表是将其他列表作为它的元素的列表,前一章介绍了如何使用一个列表来存储线性的元素集合,可以使用列表来存储二维数据,需要的朋友可以参考下
    2023-11-11
  • Python pickle类库介绍(对象序列化和反序列化)

    Python pickle类库介绍(对象序列化和反序列化)

    这篇文章主要介绍了Python pickle类库介绍(对象序列化和反序列化),本文讲解了pickle库的作用、pickle的运行过程、使用实例、修改picklable类型的默认行为等内容,需要的朋友可以参考下
    2014-11-11
  • Python格式化字符串的案例方法

    Python格式化字符串的案例方法

    在编写程序的过程中,经常需要进行格式化输出,每次用每次查,干脆就在这里整理一下,下面这篇文章主要给大家介绍了关于python字符串格式化的相关资料,分别是%格式符和format方式,需要的朋友可以参考下
    2022-03-03
  • 详解python字符串驻留技术

    详解python字符串驻留技术

    在本文中,我们将深入研究 Python 的内部实现,并了解 Python 如何使用一种名为字符串驻留(String Interning)的技术,实现解释器的高性能。
    2021-05-05
  • 关于pycharm中pip版本10.0无法使用的解决办法

    关于pycharm中pip版本10.0无法使用的解决办法

    近期在利用 pycharm 安装第三方库时会提示 pip 不是最新版本, 因此对 pip 进行更新,但是生成最新版本之后, pip 中由于缺少 main 函数,导致在 pycharm 中无法自动安装第三方库。本文就介绍一下如何解决
    2019-10-10
  • python从子线程中获得返回值的方法

    python从子线程中获得返回值的方法

    今天小编就为大家分享一篇python从子线程中获得返回值的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01

最新评论