python中的eval()函式eval(expression, globals=none, locals=none) 官方文件中的解釋是,將字串str當成有效的表示式來求值並返回計算結果。globals和locals引數是可選的,如果提供了globals引數,那麼它必須是dictionary型別;如果提供了locals引數,那麼它可以是任意的map物件。
example:
a=1g=eval("a+1",g)
返回21
python是用命名空間來記錄變數的軌跡的,命名空間是乙個dictionary,鍵是變數名,值是變數值。
當一行**要使用變數 x 的值時,python 會到所有可用的名字空間去查詢變數,按照如下順序:
1)區域性名字空間 - 特指當前函式或類的方法。如果函式定義了乙個區域性變數 x, 或乙個引數 x,python 將使用它,然後停止搜尋。
2)全域性名字空間 - 特指當前的模組。如果模組定義了乙個名為 x 的變數,函式或類,python 將使用它然後停止搜尋。
3)內建名字空間 - 對每個模組都是全域性的。作為最後的嘗試,python 將假設 x 是內建函式或變數。
python的全域性名字空間儲存在乙個叫globals()的dict物件中;區域性名字空間儲存在乙個叫locals()的dict物件中。我們可以用print (locals())來檢視該函式體內的所有變數名和變數值。
eval()使用原因:
2)在machin learning裡根據使用者使用這個軟體頻率,以及方式,可動態地修改**,適應使用者的變化。
#test eval() and locals()x = 1
y = 1
num1 = eval("x+y")
print (num1)
def g():
x = 2
y = 2
num3 = eval("x+y")
print (num3)
num2 = eval("x+y",globals())
#num2 = eval("x+y",globals(),locals())
print (num2)
g()print locals()["x"]
print locals()["y"]
print globals()["x"]
print globals()["y"]
num1的值是2;num3的值也很好理解,是4;num2的值呢?由於提供了globals()引數,那麼首先應當找全域性的x和y值,也就是都為1,那麼顯而易見,num2的值也是2。如果注釋掉該句,執行下面一句呢?根據第3)點可知,結果為4
locals()物件的值不能修改,globals()物件的值可以修改
#test globals() and locals()z=0def f():
z = 1
print (locals())
locals()["z"] = 2
print (locals())
f()
globals()["z"] = 2
print (z)
可以得出,兩個print (locals())的結果是一樣的,說明沒有修改成功。而print (z)的值是2,說明修改成功了
eval有安全性問題,比如使用者惡意輸入就會獲得當前目錄檔案
eval("__import__('os').system('dir')")
>>> import os>>> 'os' in globals()
true
>>> os.system('whoami')
ap\zhail
0
怎麼避免安全問題?
1.自行寫檢查函式;
2.使用ast.literal_eval
python中的eval函式
eval 函式用來執行乙個字串表示式,並返回表示式的值。還可以把字串轉化為list tuple dict。eval函式的語法 eval expression globals locals 引數 expression 表示式。globals 變數作用域,如果被提供,必須是乙個字典物件。locals 變...
Python中的eval函式
一 簡介 eval函式就是實現list dict tuple與str之間的轉化,而str函式實現把list dict tuple轉換成字串 1 字串轉化為列表 1 字串轉化為列表 2 a 1,2 3,4 5,6 7,8 9,10 3 print type a 4 b eval a 5print ty...
python中eval函式的用法
eval函式是將字串轉化為list dict tuple,但是字串裡的字元必須是標準的格式,不然會出錯。str 1,3,hello 1314hs p eval str 字元裡面必須是列 式 print type str print type p print 字串轉列表 p 結果 str 6,3 6,...