1.exec()將字符串作為代碼運行
exec("print('hello,world')") >>hello,world
exec函數主要用於動態地創建代碼字符串。如果這種字符串來自其他地方,就幾乎無法確定它將包含什么內容。因此為了安全起見,要提供一個字典以充當命名空間。
命名空間:可以視為一個放置變量的地方,類似於一個看不見的字典。因此,當你執行語句x=1時,將在當前命名空間存儲鍵x和值1。當前命名空間通常是全局命名空間,但也並非必然如此。
from math import sqrt scope={} exec('sqrt=1',scope) sqrt(4) >>2.0 scope['sqrt'] >>1
如此可見,可能帶來破壞的代碼並非覆蓋函數sqrt。sqrt函數該怎樣還怎樣,而通過exec執行賦值語句創建的變量位於scope中。
2. eval()
eval是一個類似於exec的內置函數。
exec執行一系列Python語句,而eval計算用字符串表示的Python表達式的值,並返回結果。(exec什么都不返回,因為它本身是條語句)
與exec一樣,也可以向eval提供一個命名空間。
eval(input("input an expression:")) >input an expression:4+8 >12