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語句提供兩個命名空間,一個是全局的一個是局部的,全局的必須是字典,局部的可以是任何形式的映射)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章