Python中的eval 函式

2022-08-02 08:12:10 字數 1997 閱讀 7986

python中的eval()函式eval(expression, globals=none, locals=none)  官方文件中的解釋是,將字串str當成有效的表示式來求值並返回計算結果。globals和locals引數是可選的,如果提供了globals引數,那麼它必須是dictionary型別;如果提供了locals引數,那麼它可以是任意的map物件。

example:

a=1

g=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,...