exec()函數
exec函數用於執行存儲在字符串中的python語句
>>> exec("x=1") >>> x 1
但有時候,直接這樣執行可能會污染我們的命名空間,比如下面的例子,我們使用python內置的abs函數求絕對值。
>>> abs(-1) 1 >>> exec("abs='xyz'") >>> abs(-1) File "<stdin>", line 1, in <module> TypeError: "str" object is not callable
在執行abs函數時報錯了,類型錯誤,字符串類型對象不能被調用,原因就在於我們使用exec函數將字符串xyz賦值給了abs,abs此時已經不再表示求絕對值的函數了。為了防止出現這種情況,我們在調用exec函數時,可以給它傳遞第二個參數——命名空間,即就是一個字典。
>>> abs(-1) 1 >>> scope = {} >>> exec("abs='xyz'", scope) >>> abs(-1) 1 >>>scope['abs'] 'xyz'
這樣,通過exec執行賦值語句創建的變量就位於scope中,不會污染我們的命名空間。
eval()函數
eval用於執行存儲在字符串中的python表達式
>>> eval("1+2+3+4+5") 15
與exec函數一樣,我們也可以給eval函數提供命名空間。
總結
1、exec函數執行的是python語句,沒有返回值,eval函數執行的是python表達式,有返回值;
2、exec函數和eval函數都可以傳入命名空間作為參數,實際上,可以向exec函數和eval函數提供兩個命名空間,他們的函數定義為:
exec(source, globals=None, locals=None)
eval(source, globals=None, locals=None)
其中globals和locals都是可選參數,globals表示全局命名空間,必須是字典,locals表示局部命名空間,可以是任何映射。
3、需要注意的是,exec函數和eval函數都是將用戶提供的字符串作為代碼執行,將無法控制代碼的行為,會帶來嚴重的安全隱患,使用的時候要慎重。