python中的pass,del,exec,eval語句
(1)pass語句
pass代表該語句什麼都不做,因爲python中空代碼是非法的,比如一個if語句要求什麼內容都不做,我們就可以使用pass語句。
(2)del語句
一般來說python會刪除那些不在使用的對象(因爲使用者不會再通過任何變量或者數據結構引用它們)
接下來我們看一個例子:
>>> ls = {'a':1,'b':2,'c':3}
>>> y = ls
>>> y
{'a': 1, 'c': 3, 'b': 2}
>>> y = None
>>> y
>>> ls
{'a': 1, 'c': 3, 'b': 2}
>>> ls = None
>>> ls
首先y和ls兩個對象被綁定在同一個字典上,所以當y被設置成None時,字典通過ls依然可以使用,但是當我們把ls也設置成爲none時,字典就"漂"在內存裏了,沒有任何名字綁定在它上面,沒有辦法去獲取到它,所以python會去直接刪除它(這種行爲成爲垃圾收集),另一個方法就是del方法,它不僅可以移除一個對象的引用,還可以刪除那個名字本身。
再看一個例子:
>>> x = 1
>>> y = x
>>> del x
>>> x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
>>> y
1
x和y都指向同一個列表,但是刪除x並不會影響y。原因就是因爲刪除的只是名稱,而並不是列表本身(即值)。事實上python是無法刪除值。
(3)exec語句(運行字符串中的程序)
>>> exec "print 'hello world'"
hello world
但是有時會存在一個問題,很多情況下可以給它提供一個命名空間--可以放置變量的地方,這樣會干擾你的命名空間(放置變量的地方),比如會出現這樣的情況。
>>> from math import sqrt
>>> sqrt(4)
2.0
>>> exec 'sqrt = 1'
>>> sqrt(4)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable
exec最有用的地方在於可以動態的創建代碼字符串。如果字符串是從其他地方獲得--可能是從用戶那裏獲得,那麼幾乎不能確定其中包含什麼代碼。所以爲了安全起見,可以增加一個字典,起到命名空間的作用。
可以通過in <scope>來實現,其中<scope>就是放置代碼字符串的命名空間作用的字典。
>>> from math import sqrt
>>> tt = {}
>>> exec 'sqrt = 1' in tt
>>> sqrt(4)
2.0
上述的命名空間幾乎都是全局命名空間。從上的例子中我們可以看出,潛在的破壞性代碼並不會覆蓋sqrt函數,原來的函數可以正常運作,而通過exec賦值的變量sqrt只在它的作用域內有效。注意:如果要將tt打出來的話,會看到很多東西,因爲內建函數__builtins__字典自動包含所有的內建函數和值。
>>> tt.keys()
['__builtins__', 'sqrt']
>>> tt['sqrt']
1
(4)eval函數(會計算python表達式(以字符串形式書寫),並且返回結果)
>>> eval_r('2+ 2')
4
>>> exec '2 + 2'
>>> eval_r(raw_input("please input number"))
please input number2*3-1
5
eval也可以使用命名空間,儘管表達式幾乎不像語句那樣爲變量重新賦值,事實上,可以給eval語句提供兩個命名空間,一個是全局的一個是局部的,全局的必須是字典,局部的可以是任何形式的映射)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.