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' 来判断元素是否属于集合
数据类型分类
数据类型 | 存储模型 | 更新模型 | 访问模型 |
---|---|---|---|
数字 | 标量 | 不可变 | 直接访问 |
字符串 | 标量 | 不可变 | 顺序访问 |
元组 | 容器 | 不可变 | 顺序访问 |
列表 | 容器 | 可变 | 顺序访问 |
字典 | 容器 | 可变 | 映射访问 |
集合 | 容器 | 可变/不可变 |
网友评论