Python是動態語言,也就是變數本身並沒有型態資訊,型態的資訊是在執行時期的物件之上,在Python中要建立變數,無需宣告型態,只要命名變數並指定值給它,就建立了一個變數,在建立變數之前,嘗試存取某個變數會發生變數未定義的錯誤。例如:
| >>> x Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'x' is not defined >>> x = 10 >>> x 10 >>> x = 'Justin' >>> x 'Justin' >>> |
在上例中,一開始建立了一個x變數,參考至整數10,由於變數本身沒有型態,之後你可以將字串'Justin'指定給x。在Python中,變數始終是個參考至真實物件的名稱,指定運算只是改變變數的參考對象。例如:
| >>> x = 1.0 >>> y = x >>> id(x) 19437008 >>> id(y) 19437008 >>> y = 2.0 >>> id(x) 19437008 >>> id(y) 19436976 >>> |
在上例中,x一開始參考至1.0整數物件,而後將x參考的物件指定給y來參考,你可以使用id()函式來取得所參考物件的記憶體位址代表數字,可以看到x與y都參考同一物件。之後y參考至2.0,所以x與y就參考至不同的物件。
下面這個例子亦顯示了,變數在Python中只是一個參考(而所有的資料都是物件):
| >>> x = 1 >>> id(x) 505389048 >>> x = x + 1 >>> id(x) 505389064 >>> |
一開始x參考至1整數物件,之後+運算後,建立了新的2整數物件,而後指定給x,所以x參考至新的物件。由於變數在Python中只是個參考至物件的名稱,所以對於可變動物件,才會有以下的操作結果:
| >>> x = [1, 2] >>> x [1, 2] >>> x[0] = 10 >>> x [10, 2] >>> |
在Python中,==用來比較兩個物件的實質內容是否相同。例如:
| >>> list1 = [1, 2, 3] >>> list2 = [1, 2, 3] >>> list1 == list2 True >>> |
但實際上list1與list2是參考至不同的物件。如果你想要比較兩個變數是否參考至同一物件,可以使用is運算:
| >>> id(list1) 26224600 >>> id(list2) 26225200 >>> list1 is list2 False >>> |
變數本身沒有型態,若你透過變數操作物件的某個方法,只要確認該物件上確實有該方法即可。例如:
| >>> x = [1, 2, 3] >>> x.index(2) 1 >>> x = (10, 20, 30) >>> x.index(20) 1 >>> |
這是動態語言所流行的 鴨子定型(Duck typing):「如果它走路像個鴨子,游泳像個鴨子,叫聲像個鴨子,那它就是鴨子。」
如果你不再需要一個變數,則可以使用del將之刪除。例如:
| >>> x = 10 >>> x 10 >>> del x >>> x Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'x' is not defined >>> |
沒有留言:
張貼留言