1. 程式人生 > >Python——動態資料型別

Python——動態資料型別

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 = 1
>>> b = a
>>> a
1
>>> b
1
>>> a = 3
>>> a
3
>>> b
1
但是整數並不能在原處修改,a重新引用了一個物件3之後,並不能影響b,所以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函式會返回物件的引用次數。

>>> 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
在上例中,在IDLE GUI中查詢整數物件1時,它報告這個物件有1133次重複引用(絕大部分都是IDLE系統程式碼所引用的)
在Python中,從技術上來講,物件有更復雜的結構而不僅僅是有足夠的空間表示它那麼簡單。每一個物件都有兩個標準的頭部資訊:一個型別識別符號去標識這個物件的型別,以及一個引用計數器,用來決定是不是可以回收這個物件。

【型別屬於物件,而不是變數,比如a = 3,這時候a是整數型別,下一句執行a="3",a又變成了字串型別,這是根據a變數指向的物件決定的,而不是a變數決定的】