Python中怎么通過變量獲取變量名

Python中怎么通過變量獲取變量名,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。

創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站建設(shè)、做網(wǎng)站與策劃設(shè)計(jì),蘭溪網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10多年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:蘭溪等地區(qū)。蘭溪做網(wǎng)站價(jià)格咨詢:028-86922220

創(chuàng)建線程

Python中使用多線程很方便, threading.Threaded(函數(shù), 參數(shù)表)然后thread.start就好了. 只是有一點(diǎn)需要注意, 上面參數(shù)表必須是個(gè)元組, 也就是每個(gè)元素后面必須跟個(gè)逗號(hào).

import threadingdef anyFunction(aaa): return str(aaa) #某種處理結(jié)果, 比如字符串def manualInput(xxx): data = input("請(qǐng)輸入%s: " % xxx) pass # 各種處理(比如數(shù)據(jù)轉(zhuǎn)換什么的)exampleThread = threading.Thread(target = manualInput, args = ( anyFunction("汪汪汪"), ), name = "喵喵喵")exampleThread.start()

通過函數(shù)修改某個(gè)指定的(通過名字即字符串)變量的值但這又出來一個(gè)問題, 如果不能使用全局變量, 該如何在另一個(gè)函數(shù)里修改其參數(shù)對(duì)應(yīng)的內(nèi)容呢? 這里的重點(diǎn)歸結(jié)起來是"函數(shù)如何修改自身參數(shù)的內(nèi)容".

于是我想到了一個(gè)騷透了的方法——改變量字典…… 因?yàn)閜ython的變量是基于標(biāo)簽的. python中的變量大致可以理解成給內(nèi)容貼上標(biāo)簽(每個(gè)標(biāo)簽對(duì)應(yīng)一個(gè)變量名, 多個(gè)標(biāo)簽可能會(huì)引用同一個(gè)內(nèi)容, 沒被引用的內(nèi)容就會(huì)被python釋放), 每個(gè)標(biāo)簽都會(huì)有一個(gè)id(同時(shí), 一個(gè)內(nèi)存數(shù)據(jù)只要被引用那么自身也有個(gè)id). 示例:

print(id("喵喵喵"),"~~", id("喵喵喵"),"~~", id("喵喵喵"),"~~")[Out]:1392371317520 ~~ 1392371317520 ~~ 1392371317520 ~~print(id("喵喵喵")); print(id("喵喵喵")); print(id("喵喵喵"))[Out]:139237131857613923713180001392371318288

python維護(hù)這些標(biāo)簽和內(nèi)容的對(duì)應(yīng)關(guān)系可以通過字典的方式來讀取和修改, 改globals()[待改的變量的原名]的值就能通過指定變量名來修改變量了.

通過globals的字典修改變量

通過變量來獲取變量的名字(字符串)上面通過globals()[待改的變量的原名] = 新的內(nèi)容的方式實(shí)現(xiàn)了修改變量的內(nèi)容, 可是, 待改的變量的原名是個(gè)字符串, 怎么通過變量得到這個(gè)變量的名字呢?

一個(gè)思路是字典法.

把當(dāng)前運(yùn)行環(huán)境中的所有變量復(fù)制一份(淺拷貝和深拷貝效果都一樣, 因?yàn)樯顪\拷貝前后都是相同的標(biāo)簽), 然后新建一個(gè)"標(biāo)簽id-變量名"的對(duì)照表字典, 利用字典賦值的特性, 遍歷復(fù)制來的全局變量, 把id(變量值)作為key而變量名作為value, 即標(biāo)簽id-變量名字典[id(變量值)] = 變量名.

test = "some values"變量A = "汪汪汪"當(dāng)前所有變量 = globals().copy()print(當(dāng)前所有變量)[Out]:{'__name__': '__main__',..., 'test': 'some values', '變量A': '汪汪汪'}內(nèi)容_變量名字符串對(duì)照表 = {}for 變量名, 變量值 in 當(dāng)前所有變量.items(): 內(nèi)容_變量名字符串對(duì)照表[id(變量值)] = 變量名print(內(nèi)容_變量名字符串對(duì)照表)[Out]:{2437914516272: '__name__',..., 2437948462576: 'test', 2437948432816:'變量A'}

這樣一來就建立一個(gè)內(nèi)容-變量名字符串的對(duì)照表, 又因?yàn)閕d(變量A) 和 id(變量A的值)是相等, 利用這個(gè)特性就能通過變量來取變量值了.

變量A的值 = 變量Aprint(id(變量A的值)[Out]:2437948432816內(nèi)容_變量名字符串對(duì)照表[id(變量A的值)][Out]:'變量A'

通過函數(shù)修改變量

上面這一堆頭發(fā)就是為了動(dòng)態(tài)、通用地修改變量, 封裝成函數(shù)就能在任何地方調(diào)用和修改了.

def 一個(gè)實(shí)現(xiàn)變量修改函數(shù)(要改的變量, 提示語): 當(dāng)前所有變量 = globals().copy() 變量id表 = {} for 變量名, 變量值 in 當(dāng)前所有變量.items():  變量id表[id(變量值)] = 變量名 待改的變量的原名 = 變量id表[id(要改的變量)] 新的內(nèi)容 = str(input(提示語)) if len(新的內(nèi)容) > 0 :  globals()[待改的變量的原名] = 新的內(nèi)容 return 待改的變量的原名tmp = "汪汪汪"

一個(gè)實(shí)現(xiàn)變量修改函數(shù)(tmp, "請(qǐng)輸入新值: ")

[Out]:請(qǐng)輸入新值: 喵喵喵 'tmp'print(tmp)[Out]:喵喵喵

總結(jié)(demo)[不想看中間過程的話可以直接看這]

import time, threading# 這里的demo是為了通用化. 因?yàn)樵谝粋€(gè)線程中再嵌套另個(gè)線程的話, 嵌套的線程獲取不到所有變量class ThreadWithReturn(threading.Thread): def __init__( self, target = None, args = () ):  super(ThreadWithReturn,self).__init__()  self.func = target  self.args = args def run(self):  self.result = self.func(*self.args) def getResult(self):  try:   return self.result  except Exception as errInfo:   print("遇到錯(cuò)誤: ", errInfo)   return Nonedef 一個(gè)實(shí)現(xiàn)變量修改函數(shù)(要改的變量, 提示語): 當(dāng)前所有變量 = globals().copy() 變量id表 = {} for 變量名, 變量值 in 當(dāng)前所有變量.items():  變量id表[id(變量值)] = 變量名 try:  待改的變量的原名 = 變量id表[id(要改的變量)] except KeyError:  print("***debug: 在不同的線程中運(yùn)行, 獲取不到出入變量的名字")  待改的變量的原名 = None 新的內(nèi)容 = str(input(提示語)) if len(新的內(nèi)容) > 0 :  if 待改的變量的原名 != None:   globals()[待改的變量的原名] = 新的內(nèi)容 else:  新的內(nèi)容 = None return [待改的變量的原名, 新的內(nèi)容]def Gexit(): exitConfirm = "u" waitForConirm = ThreadWithReturn( target = 一個(gè)實(shí)現(xiàn)變量修改函數(shù), args = (exitConfirm, "收到了退出信號(hào), 默認(rèn)30秒后退出, 是否現(xiàn)在退出呢? (Y/n) 請(qǐng)輸入: ",) ) waitForConirm.start() waitForConirm.join(30) try:  exitConfirm = waitForConirm.getResult()[1]  print("***debug, got:", exitConfirm) except Exception as errInfo:  print("***debug:", errInfo)  exitConfirm = "u" if exitConfirm == "u":  print("等待超時(shí), 開始退出流程...")  exitConfirm = "Ytt" if exitConfirm == "Ytt" or exitConfirm == "Y":  if exitConfirm == "Y":   print("確認(rèn)退出, 開始退出流程...")   pass # 這里放程序退出邏輯 if exitConfirm == "n":  print("取消退出, 繼續(xù)運(yùn)行...")  pass # 這里放繼續(xù)運(yùn)行的邏輯 return 0Thread_waitForExit = threading.Thread(target = Gexit, args = ())Thread_waitForExit.start()Thread_waitForExit.join(45)

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。

當(dāng)前題目:Python中怎么通過變量獲取變量名
當(dāng)前路徑:http://muchs.cn/article20/iiocco.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、面包屑導(dǎo)航、網(wǎng)頁設(shè)計(jì)公司、搜索引擎優(yōu)化、關(guān)鍵詞優(yōu)化、靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)