1, 在Python中,類型永遠跟隨object,而非variable。Variable沒有類型。程序員
2,在下面的三個式子中,a首先被賦予整形3,再被賦予字符串‘spam’,後再被賦予float型數值1.23. 這在Python中是可行的,而在C語言中不行。spa
>>> a = 3 # It's an integer >>> a = 'spam' # Now it's a string >>> a = 1.23 # Now it's a floating point
3,在Python中,variable和object的這種關係稱爲引用(reference):code
每一次a被賦予一個新的值,這個箭頭就被指向新的object。對象
4,每個object除了有足夠的內存空間來存儲它的值,還有2個標題字段(header fields):
A,type designator用來標記這個object的類型
B,reference counter 用來肯定是否能夠回收這個object了。
好比,3這個object內的type designator就告訴Python,其類型是integer。ip
5,Python能夠對對象進行自動地回收。這就是reference counter作的事情。若是指向這個object的reference個數爲零,這個object就被馬上回收。因此,程序員無需本身對其回收。如上面的a,當其被從3,指向字符串‘spam’的時候,若是3沒有在被其餘的variable所引用,3這個object將當即被Python回收。既其reference counter 從 1 降至0.內存
6,share reference: 以下的代碼表示object 3被a和b同時引用了:字符串
若是a被從新賦值爲‘spam’,則表示a的引用變成新的object,即‘spam’,而b仍然指向3這個object。這告訴咱們,b不是指向a,而是指向object。全部的variable都不是指向variable,而是指向object。string
7,share reference and in-place changes.
何爲in-place changes ? in-place changes 指的是針對mutable類型的type,是能夠對其修改內容的,包括:dictionary、list、set。改變這種type的某個位,並非構造一個新的object,而是修改原先的object。以下,這種狀況的發生表示L2隨L1改變了,programmer應該意識到這個問題。it
>>> L1 = [2, 3, 4] # A mutable object >>> L2 = L1 # Make a reference to the same object >>> L1[0] = 24 # An in-place change >>> L1 # L1 is different [24, 3, 4] >>> L2 # But so is L2! [24, 3, 4]
8,若是不想影響L2,則應該將原本的L1複製一份,在讓L2指向這個複製的object。
對於list,能夠用切片的方法複製以個新的list。io
>>> L1 = [2, 3, 4] >>> L2 = L1[:] # Make a copy of L1 (or list(L1), copy.copy(L1), etc.) >>> L1[0] = 24 >>> L1 [24, 3, 4] >>> L2 # L2 is not changed [2, 3, 4]
而set、dictionary沒有切片的方法,則須要用copy的方法,固然,copy一樣適用於list:
import copy X = copy.copy(Y) # Make top-level "shallow" copy of any object Y X = copy.deepcopy(Y) # Make deep copy of any object Y: copy all nested parts
9, == 表明值相同則返回True,不然,返回False。
is表明引用相同則返回True,不然,返回Flase。這個判斷會更加嚴格。is的值爲True的兩個量,其==一定也是True。
>>> L = [1, 2, 3] >>> M = [1, 2, 3] # M and L reference different objects >>> L == M # Same values True >>> L is M # Different objects , L 和M 指向了不一樣的object。 False
10,因爲Python會存儲一些小的integer和小的string以方便從新利用。故有些時候,本該被回收的object(小的integer或者小的string)並無被及時地回收,而是仍然存儲在內存裏。
>>> X = 42 >>> Y = 42 # Should be two different objects >>> X == Y True >>> X is Y # Same object anyhow: caching at work! True