Python 的基本數據類型
數字
字符串
元組
列表
字典
集合
根據不同的特性,有 3 種模型可以幫我們對 Python 的數據類型進行分類。根據不同的模型進行分類可以幫助我們更好的了解數據類型的工作原理及不同數據類型之間的關系。
另外需要注意的是,數據類型指的是對象的數據類型,而非變量。在 Python 中變量不存在數據類型的概念。
1. 存儲模型
簡單來說存儲模型即通過數據類型所能存儲對象的數量來進行分類。
標量/原子類型:可以存儲單個對象的類型
容器類型:可以存儲多個對象的類型。在 Python 中,所有的容器對象都可以存儲不同數據類型的對象
分類 | 數據類型 |
---|---|
標量/原子類型 | 數字、字符串 |
容器類型 | 元組、列表、字典、集合 |
盡管字符串通常包含多于 1 個字符,但字符串屬于標量類型,一個字符串視為一個整體。
2. 更新模型
更新模型是指在對象創建以后,它的值是否可以更新。
分類 | 數據類型 |
---|---|
可變類型 | 列表、字典、可變集合 |
不可變類型 | 數字、字符串、元組、不可變集合 |
需要注意的是:
- 當對數字、字符串等變量重新賦值時,實際上是創建了新的對象,并更新變量的引用
>>> a = 1
>>> id(a)
39259240
>>> a = 2
>>> id(a)
39259216 # 變量 a 在重新賦值以后指向的內存地址發生改變
- 由于元組屬于容器,因此元組中的元素可能是列表等可變對象,當元組中某一可變元素發生變化時,元組事實上確實發生了變化。但我們仍然認為元組是不可變的。
>>> a = (1, 2, [3])
>>> id(a)
140200782961952
>>> a[2] = 2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> a[2][0] = 2
>>> a
(1, 2, [2])
>>> id(a)
140200782961952 #元組中的列表確實發生了改變
- Python 中集合分兩種:可變集合(set)和不可變集合(frozenset)。可變集合不可哈希,不可變集合可哈希。
>>> a = set('a')
>>> hash(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'
>>> b = frozenset('b')
>>> hash(b)
-1475720110065259131
3. 訪問模型
訪問模型是根據訪問數據對象的方式不同進行分類。
分類 | 數據類型 |
---|---|
直接訪問 | 數字 |
順序訪問 | 字符串、元組、列表 |
映射訪問 | 字典 |
- 順序訪問是指,在對象內部從 0 開始進行索引,通過索引、切片進行一個或多個元素的訪問
>>> a = 'test'
>>> a[0]
't'
>>> a[0:2]
'te'
- 映射訪問將順序訪問的數字索引更改為唯一的鍵(key),通過對 key - value 的映射來對元素進行訪問。它的元素是無序的。
>>> a = {'a':1, 'b':2}
>>> a['a']
1
>>> a['b']
2
- 由于集合本身是無序的,且無法創建索引,因此對集合的訪問只能通過循環遍歷或使用 'in' 、 'not in' 來判斷元素是否屬于集合
數據類型分類
數據類型 | 存儲模型 | 更新模型 | 訪問模型 |
---|---|---|---|
數字 | 標量 | 不可變 | 直接訪問 |
字符串 | 標量 | 不可變 | 順序訪問 |
元組 | 容器 | 不可變 | 順序訪問 |
列表 | 容器 | 可變 | 順序訪問 |
字典 | 容器 | 可變 | 映射訪問 |
集合 | 容器 | 可變/不可變 |