变量是程序存放数据的"盒子",数据类型则决定了盒子里能装什么、能做什么运算。Python 是动态类型语言,写起来很自由,但自由不等于可以乱来——理解每种类型的特性,才能写出高效且不易出错的代码。本文系统梳理 Python 的核心数据类型与变量机制。
1. 变量:名字与值的绑定
在 Python 中,赋值语句 a = 1 的含义是"把名字 a 绑定到对象 1"。变量本身没有类型,类型属于对象,因此同一个变量可以先后指向不同类型:
name = "小林" # str
age = 25 # int
height = 1.75 # float
is_student = True # bool
print(type(name)) # <class 'str'>
print(type(age)) # <class 'int'>
用 type() 查看类型,用 id() 查看对象地址。注意多个变量可以指向同一个对象,这就是"绑定"而非"复制"。
2. 内置数据类型一览
| 类别 | 类型 | 示例 | 特点 |
|---|---|---|---|
| 数值 | int / float | 42, 3.14 | 不可变,可做数学运算 |
| 文本 | str | "hello" | 不可变,字符序列 |
| 布尔 | bool | True / False | 逻辑判断 |
| 序列 | list / tuple | [1,2], (1,2) | 有序,list 可变 |
| 集合 | set | {1, 2} | 无序、自动去重 |
| 映射 | dict | {"k": "v"} | 键值对,查找快 |
3. 数字:int 与 float
整数与浮点数的运算规则略有不同,/ 永远返回浮点数,取整要用 //:
a, b = 10, 3
print(a / b) # 3.3333333333333335
print(a // b) # 3 整除
print(a % b) # 1 取余
print(a ** b) # 1000 乘方
# 浮点数精度:二进制无法精确表示 0.1
print(0.1 + 0.2) # 0.30000000000000004
涉及金额等精确计算时,应使用 decimal.Decimal 而非 float,否则会踩精度坑。
4. 布尔值与 None
bool 只有 True / False 两个值,而 None 表示"什么都没有"。判断时注意:空字符串、空列表、0、None 在条件里都等价于 False:
def show(value):
if value:
print(f"{value!r} 为真")
else:
print(f"{value!r} 为假")
show(0) # 0 为假
show("") # '' 为假
show([]) # [] 为假
show(None) # None 为假
show("Python") # 'Python' 为真
5. 类型转换与判断
Python 不会偷偷帮你转换类型,字符串拼数字会直接报错。显式转换是日常操作:
s = "42"
n = int(s) # 字符串 → 整数
f = float("3.14") # 字符串 → 浮点数
print(str(n) + "!") # 整数 → 字符串
print(isinstance(n, int)) # True
print(isinstance(f, (int, float))) # True 数字家族
6. 可变与不可变
- 不可变:int、float、str、tuple、bool。修改会产生新对象,原对象不变。
- 可变:list、dict、set。可以原地增删改,函数内修改会"穿透"到外部。
💡 学习建议:动手用type()和id()验证每个类型的行为,尤其要理解"可变对象传引用"——这是新手最容易踩的坑。