一、python對象
python使用對象模型來存儲數據。構造任何類型的值都是一個對象。
所有python對象都擁有三個特性:身份、類型、值
身份:每個對象都有一個唯一的身份標識自己,任何對象的身份可以使用內建函數 id() 來得到。
類型:對象的類型決定了該對象可以保存什么類型的值,可以進行什么樣的操作,以及遵循什么樣的規則。可以使用 type() 函數查看python對象的類型。type()返回的是對象而不是簡單的字符串。
值:對象表示的數據。
>>> value = "abc" >>> id(value) #身份 39102784L >>> type(value) #類型 <type 'str'> >>> value #值 'abc' >>>
二、python類型
(1).標准類型
1.數字(分為幾個字類型,其中三個是整型)
2.Integer 整型
3.Boolean 布爾型
4.Long integer 長整型
5.Floating point real number 浮點型
6.Complex number 復數型
7.String 字符串
8.List 列表
9.Tuple 元祖
10.Dictionary 字典
(2).其他內建類型
類型、Null對象(None)、文件、集合/固定集合、函數/方法、模塊、類
通過type()函數可以查看對象的類型
>>> type(1) <type 'int'> #它是一個類型對象 >>> type("123") <type 'str'> #它是一個類型對象 >>> type([1,2,"3"]) <type 'list'> #它是一個類型對象 >>> type((1,2,"3")) <type 'tuple'> #它是一個類型對象 >>>
類型對象的類型是type,它是所有python類型的根和所有python標准類的默認元類
>>> type(type(1)) <type 'type'> >>> type(type("123")) <type 'type'> >>>
注意:所有標准對象均可用於布爾測試,同類型的對象之間可以比較大小。每個對象天生具有布爾True或False值。值為零的任何數字或者Null對象None的布爾值都是False。
下列對象的布爾值是False:None、False、所有的值為零的數、0(整數)、0.0(浮點數)、0L(長整數)、0.0+0.0j(復數)、“”(空字符串)、[](空列表)、()(空元祖)、{}(空字典)。值不是上面列出來的任何值的對象的布爾值都是True。
三、對象的比較
(1).對象值值的比較
貼代碼
(2).對象身份的比較(重點理解哦)
對象可以被賦值到另一個變量(通過引用)。因為每個變量都指向同一個(共享的)數據對象,只要任何一個引用發生改變,該對象的其他引用也會隨之改變。
例子1:foo1和foo2指向相同的對象
foo1 = foo2 = 4.3
這個語句的實際意思是一個值為4.3的數字對象被創建,然后這個對象的引用被賦值給foo1和foo2,結果就是foo1和foo2指向同一個對象
例子2:foo1和foo2指向相同的對象
foo1 = 4.3
foo2 = foo1
這個例子非常類似上一個,一個值為 4.3 的數值對象被創建,然后賦給一個變量,當執行 foo2 = foo1 時, foo2 被指向 foo1 所指向的同一個對象, 這是因為 Python 通過傳遞引用來 處理對象。foo2 就成為原始值 4.3 的一個新的引用。這樣 foo1 和 foo2 就都指向了同一個對 象。示意圖也上圖一樣。
例子3:foo1和foo2指向不相同的對象
foo1 = 4.3
foo2 = 1.3 + 3
這個例子有所不同。首先一個數字對象被創建,然后賦值給 foo1. 然后第二個數值對象被 創建並賦值給 foo2. 盡管兩個對象保存的是同樣大小的值,但事實上系統中保存的都是兩個獨立的對象,其中foo1是第一個對象的引用, foo2則是第二個對象的引用。如下圖給我們這里有兩個不同的對象,盡管這兩個對象有同樣大小的數值。我們為什么在示意圖中使用盒子?沒錯,對象就象一個裝着內容的盒子。當一個對象被賦值到一個變量,就象在這個盒子上貼了一個標簽,表示創建了一個引用。每當這個對象有了一個新的引用,就會在盒子上新貼一張標簽。當一個引用被銷毀時,這個標簽就會被撕掉。當所有的標簽都被撕掉時,這個盒子就會被回收。
那么,Python 是怎么知道這個盒子有多少個標簽呢?每個對象都天生具有一個計數器,記錄它自己的引用次數。這個數目表示有多少個變量指向該對象。他就是上一節提到的引用計數器。
提供了is和is not運算符來測試兩個變量是否指向同一個對象。
>>> a = "123" >>> id(a) 48523104L >>> b = "123" >>> id(b) 48523104L >>> a is b True >>> id(a) == id(b) True >>>
四、工廠函數
他們看上去像函數,但實際上他們是類。當你調用它們時,實際上是生成了該類型的一個實例。
他們包含:int()、long()、float()、complex()、str()、unicode()、basestring()、list()、tuple()、type()、dict()、bool()、set()、frozenset()、object()、classmethod()、staticmethod()、super()、property()、file()
五、類型的分類
按存儲模型
1.標量/原子類型(數值,字符串)
2.容器類型(列表、元祖、字典)
按更新模型(重點看看哦)
1.可變類型(列表、字典)
所謂可變對象是指,對象的內容可變,而不可變對象是指對象內容不可變。
>>> aList = ['java',66,88,'python'] >>> aList ['java', 66, 88, 'python'] >>> aList[2] 88 >>> id(aList) #注意觀察id值 48255112L >>> aList[2] = aList[2] + 12 >>> aList[3] = "python2" >>> aList ['java', 66, 100, 'python2'] >>> id(aList) 48255112L #注意觀察id值 >>>
2.不可變類型(數字、字符串、元祖)
注意嘍:下面的例子中,事實上是一個新對象被創建,然后它取代了舊對象。新創建的對象被關聯到原來的變量名,舊對象被丟棄,垃圾回收器會在適當的時機回收這些對象。
>>> v1 = "python" >>> id(v1) 31631080L >>> v1 = "java" >>> id(v1) 31632240L #由於str是不可變的,重新創建了java對象,隨之id改變,舊對象python會在某個時刻被回收 >>> >>> v2 = 12 >>> v3 = 12 >>> id(v2),id(v3) #同指同一內存區域,id相同 (31489840L, 31489840L) >>> v2 += 1 >>> v2 13 >>> id(v2),id(v3) (31489816L, 31489840L) >>>
按訪問模型
1.直接訪問(數字)
2.順序訪問(字符串、列表、元祖)
3.映射訪問(字典)
六、不支持的類型(該版本是2.*的不支持,3.*版本的個別可能會有支持了)
1.char或byte
2.指針
3.int vs short vs long
4.float vs double