Python有哪些基本数据类型及定义语法
深入讲解Python基础数据类型及其定义语法,涵盖数值、序列、映射、集合与空值类型,结合语法示例、类型判定与内存机制剖析。
在编写 Python 程序时,数据类型决定了程序在内存中如何存储数据,以及我们可以对这些数据执行哪些运算。Python 是一门动态强类型语言:声明变量时不需要显式指明类型,变量会在赋值时自动与右侧对象绑定,但对象本身的类型系统依然非常严格。本文将梳理 Python 内置的核心基础数据类型,详细拆解每种类型的字面量定义语法、使用场景与核心机制,帮助初学者与进阶开发者建立清晰、可靠的类型认知体系。
一、Python 基本数据类型分类概述
Python 标准内置类型按逻辑功能主要划分为五大类:数值类型(Numeric)、序列类型(Sequence)、映射类型(Mapping)、集合类型(Set)以及空值类型(NoneType)。每种类型在可变性(Mutability)与访问方式上各有特点。
二、数值类型(Numeric Types)及定义语法
数值类型用于表示各种数学数值。Python 3 取消了原先 Python 2 中的 long 类型,将所有整数统一归为 int,支持根据系统内存自动扩展位宽,不会产生整型溢出。
1. 整数(int)
整数通常使用十进制数字直接字面量书写,同时也原生支持二进制、八进制和十六进制前缀表示,并允许使用下划线 _ 作为数字千分位分隔符以提升长数值代码的可读性:
# 十进制整数
count = 100
# 带有下划线分隔符的整数(等价于 1000000)
total_amount = 1_000_000
# 不同进制表示
bin_val = 0b1010 # 二进制,十进制值为 10
oct_val = 0o755 # 八进制,十进制值为 493
hex_val = 0x1A # 十六进制,十进制值为 26
# 使用 int() 构造函数转换
parsed_num = int("256")
converted_hex = int("FF", 16) # 255
2. 浮点数(float)
浮点数用于表示带小数部分的实数,底层遵循 C 语言的双精度(64 位 IEEE 754 标准)浮点数规范。定义时直接包含小数点,或采用科学计数法 e / E:
# 标准小数
ratio = 0.75
pi = 3.1415926
# 科学计数法
speed_of_light = 3.0e8 # 300000000.0
micro_sec = 1.5e-6 # 0.0000015
# 构造函数
f_val = float("3.14")
0.1 + 0.2 == 0.3 的比较会返回 False(计算结果约为 0.30000000000000004)。在金融交易或高精度计算场景中,应引入标准库 decimal.Decimal 进行定点计算。
3. 布尔值(bool)
布尔值只有两个字面量值:True 和 False(首字母必须大写)。在 Python 内部,bool 是 int 的派生子类,其中 True 的整数数值等同于 1,False 的整数数值等同于 0:
is_authenticated = True
has_permission = False
# 布尔运算
can_access = is_authenticated and not has_permission
# bool 继承自 int 的数值特性
print(True + 1) # 输出: 2
print(isinstance(True, int)) # 输出: True
4. 复数(complex)
复数包含实部(real)和虚部(imag),虚部使用字母 j 或 J 结尾表示:
z1 = 2 + 3j
z2 = complex(4, -1) # 实部为 4,虚部为 -1
print(z1.real) # 实部: 2.0
print(z1.imag) # 虚部: 3.0
print(z1.conjugate())# 共轭复数: (2-3j)
三、序列类型(Sequence Types)及定义语法
序列类型是元素有序排列的数据集合,支持正反向索引下标访问(如 seq[0]、seq[-1])以及切片操作(seq[start:stop:step])。
1. 字符串(str)
字符串是不可变的 Unicode 字符序列。Python 提供了丰富的字符串字面量界定符:
# 单引号与双引号(功能完全等价)
greeting = '你好,Python'
quote = "It's a wonderful language."
# 三引号用于多行文本与保留换行排版
document = """第一行说明
第二行细节
第三行总结"""
# 原始字符串 (raw string),禁用反斜杠转义
file_path = r"C:\new_folder\test.txt"
# 格式化字符串 (f-string,Python 3.6+ 推荐语法)
username = "张三"
score = 98.5
status_msg = f"学员 {username} 的考核评分为 {score:.1f}"
2. 列表(list)
列表是 Python 中最常用的有序且可变的容器类型,元素可以是任意类型对象,允许重复。通过中括号 [] 或 list() 定义:
# 空列表定义
empty_list = []
another_empty = list()
# 包含不同类型的字面量定义
fruits = ["apple", "banana", "orange"]
mixed = [1, "text", 3.14, True, [10, 20]]
# 动态修改与原地操作(可变特性)
fruits.append("grape") # 追加末尾
fruits[0] = "watermelon" # 替换首项
fruits.pop() # 移除并弹出末尾项
3. 元组(tuple)
元组是有序且不可变的序列类型。一旦创建,其长度与元素引用均不可更改。使用小括号 () 定义。元组常用于函数多值返回、不可变记录以及作为字典键:
# 空元组
empty_tuple = ()
# 单元素元组(核心注意点:末尾必须保留逗号,否则会被解释为普通运算括号)
single_item = (42,) # 正确的单元素元组,类型为 tuple
not_a_tuple = (42) # 错误写法,实际类型为 int
# 多元素元组与省略括号的打包语法
point = (100, 200)
coords = 10, 20, 30 # 隐式元组解包与打包
# 元组解包(Unpacking)
x, y = point
print(x, y) # 输出: 100 200
4. 范围(range)
range 是专门用来生成等差整数序列的不可变序列类型。它采用惰性计算(Lazy Evaluation),无论表示多大的区间,仅存储 start、stop 和 step 三个参数,内存占用极低:
# 语法:range(stop) 或 range(start, stop[, step])
r1 = range(5) # 0, 1, 2, 3, 4
r2 = range(1, 10, 2) # 1, 3, 5, 7, 9
r3 = range(10, 0, -2) # 10, 8, 6, 4, 2
# 常与 for 循环结合
for i in range(3):
print(f"当前轮次: {i}")
四、映射类型与集合类型及定义语法
1. 字典(dict)
字典是 Python 唯一的内置映射类型。它以哈希表结构存储键值对(Key-Value),具有平均 $O(1)$ 的高速查询与更新性能。字典键必须是可哈希对象(不可变对象),如整数、浮点数、字符串或纯不可变元组;字典值可以是任意对象。自 Python 3.7 起,标准字典严格保证保留元素的插入顺序。
# 空字典定义
empty_dict = {}
another_empty_dict = dict()
# 大括号键值对定义
user_profile = {
"uid": 1001,
"username": "coder_k",
"is_active": True,
"roles": ["admin", "editor"]
}
# 关键字参数构造语法
config = dict(host="127.0.0.1", port=8080, debug=False)
# 访问与修改
print(user_profile["username"]) # 取值
user_profile["age"] = 28 # 插入新键值对
email = user_profile.get("email", "default@example.com") # 安全取值
2. 集合(set)
集合是无序且元素互不重复的容器,底层由哈希表实现,具备极高的成员检测速度。使用大括号 {} 内填入单个元素,或通过 set() 转换:
# 包含元素的集合
unique_ids = {101, 102, 103, 101} # 自动去重,保留 {101, 102, 103}
# 空集合定义(注意:{} 默认为字典,空集合必须使用 set())
empty_set = set()
# 常用集合运算
a = {1, 2, 3}
b = {2, 3, 4}
print(a & b) # 交集: {2, 3}
print(a | b) # 并集: {1, 2, 3, 4}
print(a - b) # 差集: {1}
3. 不可变集合(frozenset)
set 本身是可变对象,因此无法作为字典的键,也无法存入另一个集合中。Python 专门提供了 frozenset(冻结集合),它的元素不可添加或删除,具备可哈希性:
# 语法:frozenset(iterable)
fixed_set = frozenset(["read", "write", "execute"])
# 可作为字典键使用
permission_matrix = {
fixed_set: "FullAccessRole"
}
五、空值类型(NoneType)
Python 中使用特殊的关键字 None 表示空值或缺失。在运行时,None 是 NoneType 类的全局唯一单例对象。常用于函数未书写 return 时的默认返回值、变量初始占位以及可选参数的默认指示:
current_user = None
def query_database(record_id):
# 若未找到记录则返回 None
return None
# 正确的判定语法:使用身份运算符 is,不要使用等于运算符 ==
if current_user is None:
print("用户未登录")
if current_user is not None:
print("用户已就绪")
六、类型判定与检查操作流程
在实际编码中,接收到未知变量时,需要根据类型采取不同的分支处理。Python 提供了两组核心工具:type() 适合精确核实具体类型对象,而 isinstance() 适合面向对象层面的继承关系兼容性检查。
七、内存机制与可变性(Mutability)剖析
理解 Python 基本数据类型最关键的分水岭在于可变类型(Mutable)与不可变类型(Immutable)的底层行为差异。变量在 Python 中更像是一个贴在对象上的“标签”(引用指针),赋值操作是将标签贴到对应的内存地址上。
- 不可变类型:包括
int、float、bool、complex、str、tuple、frozenset。对象一旦在内存中分配,其内容就不可再改变。任何对它们的修改操作,实际上都是在内存中创建了一个全新的对象,并将变量名重新指向新对象的内存地址。 - 可变类型:包括
list、dict、set。对象内部的数据可以在原内存地址上直接修改、扩容或缩减,变量名绑定的内存首地址始终不变。
八、基础数据类型速查与定义语法汇总
为了便于在日常开发中随时查阅,下表全面概括了 Python 各基础类型的字面量写法、可变属性与典型适用场景:
九、实战选型建议与高频避坑指南
掌握了各个基础类型的定义语法后,在编写实际工程代码时,建议遵循以下避坑准则:
- 默认参数陷阱:切勿使用可变对象(如
list或dict)作为函数的默认参数值(例如def append_item(val, container=[]))。因为默认参数只会在函数定义时求值一次,多次调用该函数会共享同一个列表,导致数据意外累积。正确做法是使用container=None,并在函数内部通过if container is None: container = []动态初始化。 - 单元素元组的逗号:定义单元素元组时必须保留逗号,即
single = (42,)。若写为single = (42),小括号会被当作运算符优先级提升符,变量实际会被赋值为int类型的42。 - 空字典与空集合的定义混淆:字面量
{}在 Python 中专门保留给空字典使用。如果需要声明一个空集合,必须明确调用构造函数set()。 - 浅拷贝(Shallow Copy)与深拷贝(Deep Copy):当列表或字典内部嵌套了子列表或子字典时,单纯调用
lst.copy()或切片lst[:]仅复制最外层容器,内部嵌套对象依然共享同一个引用。若需彻底解耦,应当使用copy.deepcopy()。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













