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, 13):
     exec('month_{} = temp'.format(n), {'temp': expression}, globals())

 exec 方式太容易混亂,還有另外一種動態定義變量的方法,便是上文提到的globals()與locals()方法

利用命名空間動態定義變量

首先創建locals()的副本

varDict = locals()

對於上文提到的變量便可如此定義

for n in range(1, 13):
    varDict['month_'+str(n)] = value or expression

這種方法創建的變量不會出現第一種方法中語法錯誤與變量作用域的錯誤,推薦!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM