Python——動態資料型別
阿新 • • 發佈:2019-01-10
python與Java類似,有些資料型別是值傳遞,有些是引用傳遞。
比如列表list,在原處修改值
>>> L1 = [1,2,3]
>>> L2 = L1
>>> L2
[1, 2, 3]
>>> L1[0] = 9
>>> L1
[9, 2, 3]
>>> L2
[9, 2, 3]
這個例子中,L1和L2引用了同一個物件,即指向了同一片記憶體區域,列表在原處可修改,所以L1的修改影響了L2的值。【共享引用,在原處修改】
但是整數並不能在原處修改,a重新引用了一個物件3之後,並不能影響b,所以b還是引用了1這個物件>>> a = 1 >>> b = a >>> a 1 >>> b 1 >>> a = 3 >>> a 3 >>> b 1
============================================================================
由於Python具有快取機制,所以python對小的數字也採用複用,如下例子:
>>> a = 32
>>> b = 32
>>> a == b
True
>>> a is b
True
is操作符,是在檢查物件的同一性,如果兩個變數名精確地指向了同一個物件,它會返回True。實際上,is只是比較實現引用的指標,是否指向同一個物件。上例中,按照常規,因為我們運行了兩個不同的常量表達式,a和b兩個變數應該指向不同的物件,但這裡a is b返回了True,說明a和b指向了同一個物件。
這就說明,在Python中,小的整數和字串被快取並複用了
實際上,如果你想刨根問底的話,你可以向Python查詢一個物件的引用次數:在sys模組中的getrefcount函式會返回物件的引用次數。
在上例中,在IDLE GUI中查詢整數物件1時,它報告這個物件有1133次重複引用(絕大部分都是IDLE系統程式碼所引用的)>>> import sys >>> sys.getrefcount(1) 1130 >>> a = 1 >>> sys.getrefcount(1) 1130 >>> b= 1 >>> sys.getrefcount(1) 1130 >>> d= 1 >>> sys.getrefcount(1) 1131 >>> e = 1 >>> sys.getrefcount(1) 1132 >>> f = 1 >>> sys.getrefcount(1) 1133
在Python中,從技術上來講,物件有更復雜的結構而不僅僅是有足夠的空間表示它那麼簡單。每一個物件都有兩個標準的頭部資訊:一個型別識別符號去標識這個物件的型別,以及一個引用計數器,用來決定是不是可以回收這個物件。
【型別屬於物件,而不是變數,比如a = 3,這時候a是整數型別,下一句執行a="3",a又變成了字串型別,這是根據a變數指向的物件決定的,而不是a變數決定的】