參考鏈接:https://www.cnblogs.com/technologylife/p/9211324.html
參考鏈接(未)(使用inspect 獲取變量名):https://blog.csdn.net/s740556472/article/details/80928849
更容易理解的(未):https://segmentfault.com/q/1010000000405232
問題:
為什么要那樣獲取變量名呢?明明都已經把變量名給敲出來了?
需求和要求:
動態產生的變量名應該是有規律的
動態創建
使用exec動態賦值
exec是python3里的內置函數,支持python代碼的動態運行
這種方式就相當於是執行了語句“var1=1”
if __name__=="__main__": for i in range(5):#注意隨意指定的5,可看為個數 exec('var{}={}'.format(i,i)) # print (n0) print(var1,var2,var3)
#輸出:
1,2,3
利用命名空間動態賦值
在Python的命名空間中,將變量名與值存儲在字典中,
可以通過locals()
,globals()
函數分別獲取局部命名空間和全局命名空間。
#命名空間動態賦值 if __name__=="__main__": names=locals()#關鍵點在這 for i in range(5):#注意隨意指定的5,可看為個數 names['n'+str(i)]=i # print (n0) for i in range(5): print(names['n'+str(i)])這樣其實也不算新奇吧?
在類中使用動態變量
python的類對象的屬性儲存在的__dict__
中。__dict__
是一個詞典,鍵為屬性名,值對應屬性的值。
In [1]: class Test_class(object): ...: def __init__(self): ...: names = self.__dict__#其實和通過命名空間差不多 ...: for i in range(5): ...: names['n' + str(i)] = i ...: In [2]: t = Test_class() In [3]: print(t.n0, t.n1, t.n2, t.n3, t.n4) 0 1 2 3 4
調用
事實上,對於重復性的變量,我們一般不會這樣調用變量,如:var0, var1, var2, var3 ,var4....varN
,(即自己把變量名寫出來)
利用exec函數
同樣地,可以使用exec
調用變量
In [3]: for i in range(5): ...: exec('print(var{}, end=" ")'.format(i)) ...: 0 1 2 3 4
利用命名空間
因為命令空間的locals()
與globals()
均會返回一個字典,利用字典的get
方法獲取變量的值
In [4]: names = locals() In [5]: for i in range(5): ...: print(names.get('var' + str(i)), end=' ')
#或者
print(names['var'+str(i)])
0 1 2 3 4