Python 動態變數名定義與呼叫方法
動態變數名賦值
在使用 tkinter 時需要動態生成變數,如動態生成 var1...var10 變數。
使用 exec 動態賦值
exec
在 python3 中是內建函式,它支援 python 程式碼的動態執行。
示例:
In [1]: for i in range(5): ...: exec('var{} = {}'.format(i,i)) ...: In [2]: print(var0,var1,var2,var3,var4) 0 1 2 3 4
利用名稱空間動態賦值
在Python的名稱空間中,將變數名與值儲存在字典中,
可以通過locals()
,globals()
函式分別獲取區域性名稱空間和全域性名稱空間。
示例
>>> names = locals() >>> for i in range(5): ... names['n' + str(i) ] = i ... >>> print(n0,n1,n2,n3,n4) 0 1 2 3 4 >>>
在類中使用動態變數
Python 的類物件的屬性儲存在的 __dict__
中。__dict__ 是一個詞典,鍵為屬性名,值對應屬性的值。
示例
>>> print(n0,n4) 0 1 2 3 4 >>> class Test_class(object): ... def __init__(self): ... names = self.__dict__ ... for i in range(5): ... names['n' + str(i)] = i ... >>> t = Test_class() >>> print(t.n0,t.n1,t.n2,t.n3,t.n4) 0 1 2 3 4
呼叫動態變數
事實上,對於重複性的變數,我們一般不會這樣呼叫變數,如:var0,var4....varN,可以利用下面方法動態呼叫變數。
先定義如下變數:
示例
>>> for i in range(5): ... exec('var{} = {}'.format(i,i)) ... >>> print(var0,var4) 0 1 2 3 4
利用 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=' ') ...: 0 1 2 3 4
下面是其他網友的補充
Python 定義動態變數
問題描述
在做資料處理時,對一些分組得來的資料,所做的操作大同小異,變數的命名也都擁有相同的結構,比如對每個月份的資料求均值、方差等統計量,變數的命名可取為“n月的均值”,“n月的方差”,抽象出來就是“n月的 'm統計量' ”
在程式設計實現的時候,對上述變數的定義以及引用,都可以一同實現,從而減少了重複程式碼的數量
實現的時候遇到了動態定義變數的問題,這裡總結一下
利用 exec 動態定義變數
我們可以如此動態定義變數
for n in range(1,13): exec('month_{} = {}'.format(n,value or expression))
一般這種語句都可以正確定義變數,但有時上述語句會出錯,比如後方傳入的expression返回一個 DataFrameGroupBy 類變數時,會出現語法錯誤
File "<string>",line 1
month_12 = <pandas.core.groupby.generic.DataFrameGroupBy object at 0x000001F40E46E160>
^
SyntaxError: invalid syntax
原因未明...經過搜尋,我發現還有另一種定義方法,可以解決上述問題
for n in range(1,13): exec('month_{} = temp'.format(n),{'temp': expression})
這種方法有兩個問題:
1、利用format替換的部分需在變數名的最後方,例 month_{} ,方可執行成功,而 {}_month 便不可行,原因待查...還請各位同學指點!
File "<string>",line 1
12_month = temp
^
SyntaxError: invalid token
2、這種方法定義的變數,只在 exec 中有效,在 exec 語句外便無效,這或許是因為python將 exec 中複雜的指令當做了局部變數,可以在利用以下語句檢驗
for n in range(1,13): exec('month_{} = temp\nprint(locals()==globals())'.format(n),{'temp': expression})
其中locals()與globals()是python的內部方法,它們提供了基於字典的訪問區域性與全域性變數的方式。
如果返回 True ,說明當前環境處於全域性級別,在 exec 中的語句可以在 exec 外生效
如果返回 False ,說明當期環境處於區域性級別,定義的變數被看做區域性變數,所以不能在 exec 外呼叫,可以在語句中傳入globals()使其在全域性生效
for n in range(1,{'temp': expression},globals())
exec
方式太容易混亂,還有另外一種動態定義變數的方法,便是上文提到的globals()與locals()方法
利用名稱空間動態定義變數
首先建立locals()的副本
varDict = locals()
對於上文提到的變數便可如此定義
for n in range(1,13): varDict['month_'+str(n)] = value or expression
這種方法建立的變數不會出現第一種方法中語法錯誤與變數作用域的錯誤,推薦!