跳到主要内容

Python 数据类型

Python 中常见的数据类型有:

  • Number(数字):包括 int(整数)、float(浮点数)、bool(布尔)、complex(复数)
  • String(字符串)
  • List(列表)
  • Tuple(元组)
  • Set(集合)
  • Dictionary(字典)

注意:bool 并不是独立的第七类,它是 int 的子类,属于 Number 的一种。

按可变性划分:

  • 不可变数据(3 个):Number(数字)、String(字符串)、Tuple(元组);
  • 可变数据(3 个):List(列表)、Dictionary(字典)、Set(集合)。

此外还有 bytes(字节串,不可变)、bytearray(字节数组,可变)等二进制序列类型,用于处理字节数据。

各数据类型的常用方法已拆分为独立文档,见各节末尾的链接。

Number(数字)​

Python 支持 int、float、bool、complex(复数)。

在 Python 3 中,bool 是 int 的子类,因此布尔值可以被看作整数来使用,其中 True 等价于 1。

issubclass(bool, int) # True

True + 1 # 2
False + 1 # 1

True == 1 # True
False == 0 # True

Python 3 的 int 没有长度限制(只受内存限制),不会像 C/Java 那样发生溢出。

查询类型可用 type() 与 isinstance(),详见 逻辑判断。数字类型的数学运算、进制转换、位运算、高精度计算等常用方法,见 Number 常用方法。

String(字符串)​

  • 单引号 ' 和双引号 " 使用完全相同。
  • 三引号(''' 或 """)可以指定一个多行字符串。
  • 转义符 \;在字符串前加 r 可让反斜杠不发生转义,如 r"this is a line with \n" 则 \n 会显示,并不会换行。
  • 相邻的字符串字面量会自动拼接,如 "this " "is " "string" 会被自动转换为 this is string。
  • 字符串可以用 + 连接,用 * 重复。
  • 有两种索引方式:从左往右以 0 开始,从右往左以 -1 开始。
  • 字符串是不可变的;Python 没有单独的字符类型,一个字符就是长度为 1 的字符串。
  • 切片语法 str[start:end:step],start 包含、end 不包含。
s = '123456789' # 避免用内置的 str 作为变量名

print(s) # 输出字符串
print(s[0:-1]) # 第一个到倒数第二个字符
print(s[0]) # 第一个字符
print(s[2:5]) # 从第三个到第六个字符(不包含)
print(s[2:]) # 从第三个开始的所有字符
print(s[1:5:2]) # 从第二个到第五个、每隔一个取一个(步长为 2)
print(s * 2) # 重复字符串
print(s + '你好') # 连接字符串

print('hello\nrunoob') # \n 转义换行
print(r'hello\nrunoob') # 原始字符串,不转义

字符串的常用方法(大小写转换、拆分连接、查找替换、格式化等),见 String 常用方法。

List(列表)​

列表是有序、可变的序列,可以存放任意类型的元素,支持索引、切片、追加、删除等操作。

# 创建列表
fruits = ['apple', 'banana', 'cherry']
mixed = [1, 'hello', True, 3.14, [1, 2]] # 可以混合类型
empty = []

# 索引访问(和字符串规则一致,支持负索引)
print(fruits[0]) # apple
print(fruits[-1]) # cherry

# 切片
print(fruits[0:2]) # ['apple', 'banana']
print(fruits[::-1]) # ['cherry', 'banana', 'apple'],反转列表

列表的增删改查、排序、列表推导式等常用方法,见 List 常用方法。

Tuple(元组)​

元组是有序、不可变的序列,一旦创建就不能增删改元素,适合存放固定不变的数据。

# 创建元组
colors = ('red', 'green', 'blue')
single = ('only',) # 单元素元组必须带逗号,('only') 只是字符串
empty = ()
packed = 1, 2, 3 # 甚至可以不加括号

# 支持索引和切片,规则与列表一致
print(colors[0]) # red
print(colors[1:]) # ('green', 'blue')

# 解包(Unpacking)
r, g, b = colors
print(r, g, b) # red green blue

# 不可变:修改会报错
# colors[0] = 'pink' # TypeError: 'tuple' object does not support item assignment

元组只有 index()、count() 两个查询方法,见 Tuple 常用方法。

Set(集合)​

集合是无序、可变、元素唯一的容器,底层基于哈希表实现,适合去重和快速成员判断。

# 创建集合(自动去重)
unique_numbers = {1, 2, 3, 2, 1} # 实际存储 {1, 2, 3}
from_list = set([1, 2, 2, 3]) # {1, 2, 3}
empty = set() # 空集合必须用 set(),{} 是空字典

# 成员判断,平均 O(1)
print(2 in unique_numbers) # True

集合的增删方法、并交差等集合运算与 frozenset,见 Set 常用方法。

Dictionary(字典)​

字典是可变的键值对映射,键必须唯一且不可变(如 str、int、tuple),值可以是任意类型。Python 3.7+ 的字典保持插入顺序。

# 创建字典
person = {
'name': 'John',
'age': 30,
'city': 'New York'
}
empty = {}

# 读取:键不存在会报 KeyError
print(person['name']) # John

# 新增 / 修改
person['email'] = 'john@example.com'
person['age'] = 31

# 删除
del person['email']

# 判断键是否存在
print('name' in person) # True

字典的 get()、pop()、update()、setdefault() 等常用方法与遍历技巧,见 Dictionary 常用方法。

六大标准类型速查表​

类型创建示例有序可变允许重复成员判断典型场景
Number42, 3.14—否——数值计算
String'hello'是否是O(n)文本处理
List[1, 2, 3]是是是O(n)有序、可变的元素集合
Tuple(1, 2, 3)是否是O(n)固定数据、函数多返回值
Set{1, 2, 3}否是否(去重)O(1)去重、快速成员判断
Dictionary{'a': 1}是(3.7+)是是(键唯一)O(1)键值映射、JSON 数据

选型建议:

  • 需要下标访问、允许重复 → List
  • 数据固定不变 → Tuple
  • 需要去重或快速判断成员 → Set
  • 需要键值对映射 → Dictionary