Python 数据类型

计算机处理的本质是"数据",不同类型的数据需要用不同的方式存储和运算。Python 内置了丰富的标准数据类型,这一章我们重点讲数字、布尔、None这三个最基础的(字符串、列表、字典等容器类型后面单独成章)。

1. Python 的标准类型概览

Python 把数据类型按"是否可变"和"是否是容器"分成几类:

这一章先讲数字、布尔、None。其他类型后续章节展开。

2. 数字:int 与 float

# 1. 整数 int:Python 3 整数没有大小限制(不像 C/Java 有 int32/int64)
a = 42
b = -100
c = 0           # 0 也是 int

# 二进制(0b 开头)、八进制(0o)、十六进制(0x)
bin_num = 0b1010      # 等于十进制 10
oct_num = 0o17        # 等于十进制 15
hex_num = 0xFF        # 等于十进制 255
print(bin_num, oct_num, hex_num)   # 10 15 255

# 用下划线分隔大数,提高可读性(Python 3.6+)
population = 1_400_000_000     # 14 亿
print(population)              # 1400000000

# 2. 浮点数 float:带小数点的数
pi = 3.14159
temp = -2.5
science = 1.5e8       # 科学计数法,等于 1.5 × 10^8 = 150000000.0
print(science)        # 150000000.0

# 3. 复数 complex(数学/工程用,日常很少用)
z = 3 + 4j
print(z.real)         # 3.0  实部
print(z.imag)         # 4.0  虚部

Python 3 的整数没有大小限制(不像 C/Java 的 int32 最大 21 亿),算大数完全没问题:

big = 10 ** 100     # 10 的 100 次方,一个 googol
print(big)
# 输出: 10000000000...0 (101 位,1 后面 100 个 0)

浮点数精度陷阱:计算机用二进制存小数,有些数无法精确表示,会出现奇怪的结果:

print(0.1 + 0.2)
# 输出: 0.30000000000000004   <- 不是 0.3!

# 处理金额等需要精确的场景,用 decimal 模块
from decimal import Decimal
print(Decimal("0.1") + Decimal("0.2"))   # 0.3

3. 布尔 bool

布尔只有两个值,True(真)和 False(假),首字母必须大写。比较运算的结果就是布尔值。

# 布尔 bool:只有两个值,True 和 False(首字母必须大写)
is_open = True
is_closed = False

print(type(is_open))        # <class 'bool'>

# 比较运算的结果就是布尔值
print(10 > 3)               # True
print(10 == 3)              # False
print("abc" == "abc")       # True

# 布尔值可以做算术(True=1,False=0)
print(True + True)          # 2
print(True + False)         # 1
print(True * 5)             # 5

4. truthy 与 falsy

Python 在需要布尔值的场合(if、while、and/or),会把任意类型的值自动转成布尔。哪些算 False(称为 falsy),其余都算 True(truthy),记住下面 7 个 falsy 即可:

# 在 if/while 等需要布尔值的场合,以下值都被当作 False(假)
# 称为"falsy"值:
print(bool(0))        # False    数字 0
print(bool(0.0))      # False    浮点 0
print(bool(""))       # False    空字符串
print(bool([]))       # False    空列表
print(bool({}))       # False    空字典
print(bool(None))     # False    None
print(bool(()))       # False    空元组

# 其他所有值都是 True(truthy)
print(bool(1))        # True
print(bool("a"))      # True
print(bool([0]))      # True  (列表里有元素,哪怕只有 0)
print(bool("False"))  # True  (非空字符串都是 True,哪怕内容是 False)

这个机制非常重要,在 if 判断里经常用:

name = input("你的名字:")
if name:               # 等价于 if name != "":
    print(f"你好,{name}")
else:
    print("名字不能为空")

5. None —— "什么都没有"

None 是一个特殊的值,表示"没有值"、"未定义"、"空"。类似其他语言的 null / nil / undefined。函数没有 return 时默认返回 None。

# None 是"什么都没有"的特殊值,类似其他语言的 null
result = None
print(type(result))     # <class 'NoneType'>

# 函数没有 return 时,默认返回 None
def greet():
    print("hi")

r = greet()             # 输出: hi
print(r)                # None

# 判断是否为 None,用 is 而不是 ==
if r is None:
    print("函数没返回值")
# 输出: 函数没返回值

判断是否是 None,必须用 is 而不是 ==。这是约定俗成的写法,原因是 None 是单例(全局只有一个),is== 更准确、更快。

6. 类型转换

不同类型之间可以用 int() / float() / str() / bool() 显式转换:

# 类型转换:用 int() / float() / str() / bool() 显式转换

# 字符串转数字
n = int("42")           # 42
f = float("3.14")       # 3.14
# int("3.14")           # ❌ ValueError,字符串看起来像浮点数不能直接转 int

# 数字之间转换
print(int(3.9))         # 3   (浮点转整数,直接截断小数,不是四舍五入)
print(float(5))         # 5.0
print(round(3.5))       # 4   round 函数才是真正的四舍五入

# 任何类型转字符串
s1 = str(42)            # "42"
s2 = str(3.14)          # "3.14"
s3 = str([1, 2, 3])     # "[1, 2, 3]"

# 转 bool(配合前面讲的 falsy 规则)
print(bool(0))          # False
print(bool("非空"))      # True

新手常见错误:用 input() 读用户输入,得到的是字符串,直接做数学运算会出问题——必须先 int()float() 转换:

age_str = input("你的年龄:")   # 用户输入 "20",这是字符串
# print(age_str + 1)              # ❌ TypeError: 字符串不能加整数
age = int(age_str)               # 转成整数
print(age + 1)                   # 21

7. 查看类型:type 与 isinstance

# 1. type() 查看类型
x = 42
print(type(x))          # <class 'int'>
print(type("hi"))       # <class 'str'>
print(type([1,2]))      # <class 'list'>

# 2. isinstance() 判断是否是某类型(推荐,支持继承)
print(isinstance(x, int))           # True
print(isinstance(x, (int, float)))  # True  可以传一个元组判断多种类型
print(isinstance("hi", str))        # True

# type() vs isinstance() 的区别:
# - type() 只能精确匹配,不考虑继承
# - isinstance() 考虑父类(面向对象时重要)
# 日常判断类型,优先用 isinstance()

8. 可变 vs 不可变(核心概念)

这是 Python 一个非常重要的特性,会影响后面所有的数据结构:

# 不可变的例子
a = 10
b = a
a = a + 1      # a 指向了新的 11,但 b 还是 10
print(a, b)    # 11 10

# 可变的例子(对比)
m = [1, 2]
n = m
m.append(3)    # 原地修改 m,n 也跟着变(指向同一对象)
print(m, n)    # [1, 2, 3] [1, 2, 3]

理解这点能避免 80% 的"为什么我的列表莫名其妙变了"的 bug。

小结

这一章学了三个基础类型:int / float(数字)bool(布尔)None(空)。掌握了类型转换、type/isinstance、truthy/falsy 规则,以及最重要的可变 vs 不可变概念。下一篇看运算符——怎么对这些数据做运算。

← 上一篇 Python 变量

下一篇 Python 运算符

✈️💬