變數


依型態資訊是記錄在宣告在變數之上,或者是執行時期的物件之上,程式語言可以區分為靜態(Static)語言(例如C/C++、Java)與動態(Dynamic)語言(例如Python、JavaScript)。

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
>>>