[Learning Python] Chapter 6: The Dynamic Typing Interlude

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

clipboard.png

每一次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同時引用了:字符串

clipboard.png

若是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
相關文章
相關標籤/搜索