eval是Python的一個內置函數,這個函數的作用是,返回傳入字符串的表達式的結果。即變量賦值時,等號右邊的表示是寫成字符串的格式,返回值就是這個表達式的結果。
語法
eval(expression[, globals[, locals]])
expression : 表達式。
globals : 變量作用域,全局命名空間,如果被提供,則必須是一個字典對象。
locals : 變量作用域,局部命名空間,如果被提供,可以是任何映射對象。
命名空間:
python是用命名空間來記錄變量的軌跡的,命名空間是一個dictionary,鍵是變量名,值是變量值。
在一個 Python 程序中的任何一個地方,都存在幾個可用的名字空間。每個函數都有着自已的名字空間,叫做局部名字空間,它記錄了函數的變量,包括函數的參數和局部定義的變 量。
每個模塊擁有它自已的名字空間,叫做全局名字空間,它記錄了模塊的變量,包括函數、類、其它導入的模塊、模塊級的變量和常量。還有就是內置名字空間, 任何模塊均可訪問它,它存放着內置的函數和異常。
python的全局名字空間存儲在一個叫globals()的dict對象中;局部名字空間存儲在一個叫locals()的dict對象中。可以用print (locals())來查看該函數體內的所有變量名和變量值。
參數查找:
當后兩個參數都為空時,很好理解,就是一個string類型的算術表達式,計算出結果即可。等價於eval(expression)。
當locals參數為空,globals參數不為空時,先查找globals參數中是否存在變量,並計算。
當兩個參數都不為空時,先查找locals參數,再查找globals參數。
例子:
1、簡單表達式 print(eval('1+2')) 輸出結果:3 2、字符串轉字典 print(eval("{'name':'linux','age':18}") 輸出結果:{'name':'linux','age':18} 3、傳遞全局變量 print(eval("{'name':'linux','age':age}",{"age":1822})) 輸出結果:{'name': 'linux', 'age': 1822} 4、傳遞本地變量 age=18 print(eval("{'name':'linux','age':age}",{"age":1822},locals())) 輸出結果:{'name': 'linux', 'age': 18}