Python神奇的內置函數(shù)locals的實例講解
摘要
- 本文我們介紹神奇的locals函數(shù),包括動態(tài)創(chuàng)建變量和動態(tài)訪問變量,以及一個應用場景。
相同屬性不相鄰問題
需求:有兩個list,分別為list1和list2。list1中有n個對象,每個對象有5個屬性,其中一個屬性是tid,要求list1按tid排序,相鄰的對象的tid不能重復,m為不重復的tid數(shù)量,m不確定。list2存放的是所有可能出現(xiàn)的tid的情況。
- list1 = [task1,task2,task3…taskn]
- list2 = [tid1,tid2,tid3…tidm] (m
神奇的local函數(shù)
python語言很好的幫我們解決了這個問題:利用locals內置函數(shù)動態(tài)創(chuàng)建變量。
locals函數(shù)在這里的作用:
- - 1、根據(jù)傳遞的參數(shù)動態(tài)創(chuàng)建變量
- - 2、根據(jù)傳遞的參數(shù)動態(tài)訪問變量
demo
def apart_program_by_task(list1,list2): list_all_pro = [] #動態(tài)創(chuàng)建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) #循環(huán)訪問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中,我們可以很靈活的根據(jù)list2的長度動態(tài)創(chuàng)建len(list2)個list,然后根據(jù)拼接變量名訪問每個list,從而做到按tid歸類。
在回收所有的list時,我們也是通過拼接變量名挨個訪問每個list一次,取到頭元素加入新的list,來保證新的list中的相鄰對象的tid不相同。
更多
為什么locals函數(shù)可以動態(tài)創(chuàng)建和訪問變量,這里我們必須先介紹python的命名空間。
- 局部命名空間local:每個函數(shù)自己的命名空間,記錄函數(shù)的參數(shù)和局部變量。
- 全局命名空間global:每個模塊自己的命名空間,記錄了函數(shù)、類、導入的模塊的變量以及常量。
- 命令空間創(chuàng)建順序:
python解釋器啟動 ->創(chuàng)建內建命名空間 -> 加載模塊 -> 創(chuàng)建全局命名空間 ->函數(shù)被調用 ->創(chuàng)建局部命名空間
而locals的作用,就是以字典的形式,返回當前函數(shù)內變量名和變量值,比如:
def func(a = 1): b = 2 print(locals()) return a+b func() # {'b': 2, 'a': 1}
這就可以解釋動態(tài)訪問變量的原理了,就像訪問字典一樣,比如我們要根據(jù)key訪問字典的值,只需要
dict = {'b': 2, 'a': 1} print(dict["b"])
所以,locals()[變量名]
即可動態(tài)訪問當前函數(shù)內的變量名,而locals()[“l(fā)ist101”] = [] 也可以動態(tài)創(chuàng)建數(shù)組,等價于 list101 = []
但是locals只能訪問所在函數(shù)內部的變量,且不可修改,要訪問全局變量or修改,則需要使用globals函數(shù)。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內容請查看下面相關鏈接
相關文章
Python中的JSON?Pickle?Shelve模塊特性與區(qū)別實例探究
在Python中,處理數(shù)據(jù)序列化和持久化是極其重要的,JSON、Pickle和Shelve是三種常用的模塊,它們提供了不同的方法來處理數(shù)據(jù)的序列化和持久化,本文將深入研究這三個模塊,探討它們的特性、用法以及各自的優(yōu)缺點2024-01-01