Python神奇的內(nèi)置函數(shù)locals的實(shí)例講解
摘要
- 本文我們介紹神奇的locals函數(shù),包括動(dòng)態(tài)創(chuàng)建變量和動(dòng)態(tài)訪問變量,以及一個(gè)應(yīng)用場(chǎng)景。
相同屬性不相鄰問題
需求:有兩個(gè)list,分別為list1和list2。list1中有n個(gè)對(duì)象,每個(gè)對(duì)象有5個(gè)屬性,其中一個(gè)屬性是tid,要求list1按tid排序,相鄰的對(duì)象的tid不能重復(fù),m為不重復(fù)的tid數(shù)量,m不確定。list2存放的是所有可能出現(xiàn)的tid的情況。
- list1 = [task1,task2,task3…taskn]
- list2 = [tid1,tid2,tid3…tidm] (m
神奇的local函數(shù)
python語言很好的幫我們解決了這個(gè)問題:利用locals內(nèi)置函數(shù)動(dòng)態(tài)創(chuàng)建變量。
locals函數(shù)在這里的作用:
- - 1、根據(jù)傳遞的參數(shù)動(dòng)態(tài)創(chuàng)建變量
- - 2、根據(jù)傳遞的參數(shù)動(dòng)態(tài)訪問變量
demo
def apart_program_by_task(list1,list2):
list_all_pro = []
#動(dòng)態(tài)創(chuàng)建m個(gè)list,命名為'list'+str(tidm)
for i in list2:
locals()['list'+str(i)] = []
#拿到每個(gè)對(duì)象,獲取其tid的值,通過拼接變量名訪問對(duì)應(yīng)的list,并把該對(duì)象加入該list
for i in list1:
locals()['list'+str(i.tid)].append(i)
#循環(huán)訪問m個(gè)list的每個(gè)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
這個(gè)demo中,我們可以很靈活的根據(jù)list2的長(zhǎng)度動(dòng)態(tài)創(chuàng)建len(list2)個(gè)list,然后根據(jù)拼接變量名訪問每個(gè)list,從而做到按tid歸類。
在回收所有的list時(shí),我們也是通過拼接變量名挨個(gè)訪問每個(gè)list一次,取到頭元素加入新的list,來保證新的list中的相鄰對(duì)象的tid不相同。
更多
為什么locals函數(shù)可以動(dòng)態(tài)創(chuàng)建和訪問變量,這里我們必須先介紹python的命名空間。
- 局部命名空間local:每個(gè)函數(shù)自己的命名空間,記錄函數(shù)的參數(shù)和局部變量。
- 全局命名空間global:每個(gè)模塊自己的命名空間,記錄了函數(shù)、類、導(dǎo)入的模塊的變量以及常量。
- 命令空間創(chuàng)建順序:
python解釋器啟動(dòng) ->創(chuàng)建內(nèi)建命名空間 -> 加載模塊 -> 創(chuàng)建全局命名空間 ->函數(shù)被調(diào)用 ->創(chuàng)建局部命名空間
而locals的作用,就是以字典的形式,返回當(dāng)前函數(shù)內(nèi)變量名和變量值,比如:
def func(a = 1):
b = 2
print(locals())
return a+b
func() # {'b': 2, 'a': 1}
這就可以解釋動(dòng)態(tài)訪問變量的原理了,就像訪問字典一樣,比如我們要根據(jù)key訪問字典的值,只需要
dict = {'b': 2, 'a': 1}
print(dict["b"])
所以,locals()[變量名] 即可動(dòng)態(tài)訪問當(dāng)前函數(shù)內(nèi)的變量名,而locals()[“l(fā)ist101”] = [] 也可以動(dòng)態(tài)創(chuàng)建數(shù)組,等價(jià)于 list101 = []
但是locals只能訪問所在函數(shù)內(nèi)部的變量,且不可修改,要訪問全局變量or修改,則需要使用globals函數(shù)。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
相關(guān)文章
Pycharm關(guān)于遠(yuǎn)程JupyterLab以及JupyterHub登錄問題
這篇文章主要介紹了Pycharm關(guān)于遠(yuǎn)程JupyterLab以及JupyterHub登錄問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
pyinstaller 3.6版本通過pip安裝失敗的解決辦法(推薦)
這篇文章主要介紹了pyinstaller 3.6版本通過pip安裝失敗的解決辦法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01
Python實(shí)現(xiàn)疫苗接種管理數(shù)據(jù)庫(kù)步驟詳解
這篇文章主要為大家介紹了Python實(shí)現(xiàn)疫苗接種管理數(shù)據(jù)庫(kù)步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
Python?time三種時(shí)間轉(zhuǎn)換小結(jié)
本文主要介紹了Python?time三種時(shí)間轉(zhuǎn)換小結(jié),主要包括時(shí)間戳,結(jié)構(gòu)化時(shí)間,字符串時(shí)間,文中根據(jù)實(shí)例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
python xmind 包使用詳解(其中解決導(dǎo)出的xmind文件 xmind8可以打開 xmind2020及之后版本打
xmind8 可以打開xmind2020 報(bào)錯(cuò),如何解決這個(gè)問題呢?下面小編給大家?guī)砹藀ython xmind 包使用(其中解決導(dǎo)出的xmind文件 xmind8可以打開 xmind2020及之后版本打開報(bào)錯(cuò)問題),感興趣的朋友一起看看吧2021-10-10
Python實(shí)現(xiàn)一鍵整理百度云盤中重復(fù)無用文件
有沒有頭疼過百度云盤都要塞滿了,可是又沒有工具能剔除大量重復(fù)無用的文件?這里教你一個(gè)用Python實(shí)現(xiàn)的簡(jiǎn)單方法,通過整理目錄的方式來處理我們?cè)票P中無用的文件吧2022-08-08

