基本数据类型总结
约 1589 字大约 5 分钟
2025-04-04
阅读导览
基本数据类型总结
我们已经介绍了 Python 中的各种基本数据类型,包括 int/float/complex、bool、str、tuple、list、dict、set 等等。这里我们来做个简单的总结。
- 可变数据类型与不可变数据类型
- 基本数据类型归纳对比
- 真值判断 (True or False)
- 类型转换常见技巧
实践清单
学习练习清单
- 1跑一遍 a = 10; a = a + 1 前后的 id(a),理解“不可变”是怎么通过换地址实现的。
- 2对 list、dict、set 各跑一次原地修改前后的 id,确认它们才是真正的可变类型。
- 3试着把 list 当字典 key —— 看 TypeError,并解释为什么不可哈希。
- 4用 list(set(seq)) 给一段重复数据去重,再用 dict.fromkeys 做同样的事,体会顺序差别。
- 5练 split / join 一对组合:从 CSV 字符串拆成 list,再 join 回 CSV。
我们已经介绍了 Python 中的各种基本数据类型,包括 int/float/complex、bool、str、tuple、list、dict、set 等等。这里我们来做个简单的总结。
可变数据类型与不可变数据类型
理解“可变”与“不可变”是掌握 Python 内存管理和函数传参的关键。
- 可变数据类型 (Mutable):对象的内容可以在原地被修改,修改后内存地址(
id)保持不变。 - 不可变数据类型 (Immutable):对象的内容不能被修改。如果试图修改它,实际上是创建了一个新的对象,并改变了变量的指向。
为什么说整数不可变?
初学者容易被下面的现象迷惑,认为整数是“变”了:
python playground
a = 10
# id() 查看内存地址
print(f'修改前 id: {id(a)}')
a = a + 1
print(f'修改后 id: {id(a)}')解释: 当你执行 a = a + 1 时,Python 并不是把内存里的 10 变成了 11,而是:
- 计算
a + 1得到结果11。 - 在内存中新开辟一块空间存储
11。 - 让变量
a指向这个新的地址。 - 原来的
10如果没有其他变量引用,会被垃圾回收。
这正说明了整数是不可变的——通过改变身份(地址)来体现值的变化。
真正的“可变”行为
让我们看看列表(List):
python playground
l = [10]
print(f'修改前 id: {id(l)}')
l.append(11)
print(f'修改后 id: {id(l)}')解释: 列表修改后,id 依然没变,这才是可变数据类型。它像一个箱子,箱子还是那个箱子,但里面的东西可以换。
提示
可哈希 (Hashable) 与 不可变 通常是绑定的:
- 只有 不可变 类型才能作为字典 (
dict) 的键 (Key) 或集合 (set) 的元素。 - 因为哈希值必须固定,如果对象变了,哈希值也会变,这在哈希表中是不允许的。
基本数据类型归纳对比
| 数据类型 | 是否有序 | 是否可变 | 可否迭代 | 可否作为 Dict Key |
|---|---|---|---|---|
数字 (int/float/complex) | - | ❌ | ❌ | ✅ |
布尔 (True/False) | - | ❌ | ❌ | ✅ |
None (None) | - | ❌ | ❌ | ✅ |
字符串 (str) | ✅ | ❌ | ✅ | ✅ |
列表 (list) | ✅ | ✅ | ✅ | ❌ |
元组 (tuple) | ✅ | ❌ | ✅ | ✅ (仅当元素全为不可变时) |
字典 (dict) | ✅ (3.7+) | ✅ | ✅ | ❌ |
集合 (set) | ❌ | ✅ | ✅ | ❌ |
真值判断 (True or False)
在 Python 中,判断真假非常方便。不需要写 if len(x) > 0,直接用 if x: 即可。
以下情况会被视为 False,其他情况均为 True:
- 零值:
0,0.0,0j,Decimal(0),Fraction(0, 1) - 空序列:
'',(),[] - 空集合:
{},set() - 特殊值:
None,False
python playground
# 常见误区验证
print(bool('False')) # True,因为是非空字符串
print(bool([0])) # True,因为列表里有元素
print(bool(None)) # False类型转换常见技巧
1. 字符串转换
任何数据类型通常都可以用 str() 转换为字符串以便打印或记录。
2. 数值转换
转换时需注意格式,非法字符串会抛出 ValueError。
python playground
print(int('123')) # 123
print(float('123.45')) # 123.45
# print(int('12.3')) # 报错!int() 不能直接转换带小数点的字符串,需先转 float 再转 int
print(int(float('12.3'))) # 123. 序列互转 (List/Tuple/Set)
这是处理数据的常用技巧:
- List -> Set:最快的去重方法。
- Set -> List:去重后转回列表以便排序或索引。
- Tuple <-> List:需要修改数据时转 List,需要保护数据时转 Tuple。
python playground
data = [1, 2, 2, 3, 1]
unique_data = list(set(data)) # [1, 2, 3] (顺序可能改变)
print(unique_data)4. 字符串与列表互转 (Split & Join)
这是文本处理的黄金搭档。
- String -> List:
str.split(sep) - List -> String:
sep.join(iterable)
警告
join 方法由分隔符调用,且参数里的元素必须全为字符串。
python playground
tags = 'python,coding,study'
# 拆分
tag_list = tags.split(',')
print(tag_list) # ['python', 'coding', 'study']
# 合并
# 错误示范: '-'.join([1, 2, 3]) -> TypeError
# 正确示范:
print('-'.join(['2023', '01', '01'])) # 2023-01-015. 快速构建字典
dict() 构造函数非常强大,可以接受关键参数或 (key, value) 元组列表。
python playground
# 方式 1: 关键字参数 (Key 必须符合变量命名规则)
print(dict(name='Alice', age=18))
# 方式 2: 元组列表 (适合处理动态数据)
kv_list = [('id', 1001), ('status', 'active')]
print(dict(kv_list))
# 方式 3: 拉链函数 zip (将两个列表合并为字典)
keys = ['a', 'b', 'c']
values = [1, 2, 3]
print(dict(zip(keys, values)))核心指南:该用哪个?
在实际开发中,选择合适的数据类型能让代码更优雅、高效。
- 需要去重或快速判断“在不在里面”?
- 👉 Set (集合)。它的查找速度是 $$O(1)$$,远快于 List 的 $$O(n)$$。
- 数据是一组固定的配置,不希望被改动?
- 👉 Tuple (元组)。比 List 更轻量,且由于不可变,更安全。
- 需要存储“对象”属性(如用户的姓名、年龄)?
- 👉 Dict (字典)。语义清晰,扩展方便。
- 需要频繁增删改查的有序数据?
- 👉 List (列表)。最通用的万能容器。
重点总结
要点回收
- 可变 vs 不可变看 id:原地改还在原地的就是可变,每次都换地址的是不可变。
- 只有不可变类型才可哈希,才能当 dict 的 key 或 set 的元素。
- if x: 利用了真值判定 —— 空容器、0、None 都是 False,比 len(x) > 0 更地道。
- 选容器看意图:去重/查存在用 set,固定配置用 tuple,对象属性用 dict,通用增删用 list。
版权所有
版权归属:Shuo Liu
