当前位置: 首页 > news >正文

Python 的基本数据类型与它们之间的关系

在学习 Python 时经常会接触各种“数据类型”:
intfloatstrlistdictset ……
但这些类型之间到底有什么关系?哪些是可变的?哪些是不可变的?
它们又是如何在内存中存储和引用的?
本文将带你系统地梳理 Python 的基本数据类型体系结构,从类型分类、内存机制到相互关系,一文搞清。


文章目录

    • 一、Python 的一切皆对象(Everything is an Object)
    • 二、Python 的主要数据类型分类
      • 🔹 1. 数值类型(Numeric Types)
      • 🔹 2. 布尔类型(Boolean Type)
      • 🔹 3. 字符串类型(String Type)
      • 🔹 4. 序列类型(Sequence Types)
      • 🔹 5. 集合类型(Set Types)
      • 🔹 6. 映射类型(Mapping Type)
    • 三、可变对象 vs 不可变对象
    • 四、对象引用与共享
    • 五、类型层级与继承关系
    • 六、类型之间的相互关系与转换
    • 七、数据类型与内存模型


一、Python 的一切皆对象(Everything is an Object)

Python 是一种面向对象的语言
这意味着:无论是数字、字符串还是函数,本质上都是对象(object)。

x = 10
print(type(x))  # <class 'int'>s = "hello"
print(type(s))  # <class 'str'>

在 Python 中,每个对象都包含三部分信息

属性说明
id对象在内存中的唯一标识(类似地址)
type对象的类型(定义了它能做什么)
value对象实际存储的值

二、Python 的主要数据类型分类

Python 的内置数据类型可以按照功能或可变性来分类。

🔹 1. 数值类型(Numeric Types)

类型说明示例
int整数类型10, -3, 0
float浮点数类型3.14, -0.5
complex复数类型3 + 4j
a = 5
b = 2.3
c = 1 + 2j

这些类型都属于不可变类型
对它们的任何修改操作(如 a += 1)都会创建新对象。


🔹 2. 布尔类型(Boolean Type)

类型说明示例
bool表示逻辑真值True, False

布尔值其实是 int 的子类:

print(isinstance(True, int))  # True
print(True + True)  # 2

💡 True 的值等价于 1False 等价于 0


🔹 3. 字符串类型(String Type)

类型说明示例
str文本字符串'hello', "world"

字符串是不可变对象
任何修改操作都会生成新字符串:

s = "hello"
print(id(s))
s += " world"
print(id(s))  # ID 不同,新对象

🔹 4. 序列类型(Sequence Types)

序列是有序的元素集合。包括:

类型可变性示例
list✅ 可变[1, 2, 3]
tuple❌ 不可变(1, 2, 3)
range❌ 不可变range(0, 10)

这些类型都有索引切片迭代等共同特征:

lst = [10, 20, 30]
print(lst[0])     # 10
print(lst[1:])    # [20, 30]
for x in lst: print(x)

🔹 5. 集合类型(Set Types)

类型可变性示例
set✅ 可变{1, 2, 3}
frozenset❌ 不可变frozenset({1, 2, 3})

集合类型是无序去重的元素集合,用于数学运算:

a = {1, 2, 3}
b = {3, 4, 5}
print(a | b)  # 并集 {1, 2, 3, 4, 5}
print(a & b)  # 交集 {3}

🔹 6. 映射类型(Mapping Type)

类型可变性示例
dict✅ 可变{'name': 'Alice', 'age': 25}

字典以“键值对”形式存储数据,是 Python 中最常用的数据结构之一。

person = {'name': 'Alice', 'age': 25}
print(person['name'])  # Alice

从 Python 3.7 开始,dict 默认保持插入顺序。关于插入顺序这一块,具体可参考理解 Python 的有序字典 OrderedDict-CSDN博客


三、可变对象 vs 不可变对象

在 Python 中,数据类型可以按照是否支持原地修改(in-place modification)分为两类:

分类类型举例是否可原地修改常见操作效果
不可变对象int, float, str, tuple, frozenset❌ 否创建新对象
可变对象list, dict, set, bytearray✅ 是原地修改

示例对比:

# 不可变类型
x = 10
print(id(x))
x += 1
print(id(x))  # 变化,创建新对象# 可变类型
lst = [1, 2]
print(id(lst))
lst.append(3)
print(id(lst))  # 不变,原地修改

关于原地操作有关知识点,可参考Python 原地操作与重新赋值的区别:对比 x += 1 与 x = x +1-CSDN博客


四、对象引用与共享

在 Python 中,变量本质上是对象的“标签”,而不是容器。
多个变量可以指向同一个对象。

a = [1, 2, 3]
b = a
a.append(4)
print(b)  # [1, 2, 3, 4]

两者 id(a) == id(b),说明它们引用了同一块内存。

若要复制出独立对象,需要使用:

  • copy()(浅拷贝)
  • deepcopy()(深拷贝)

关于Python中深拷贝与浅拷贝问题,可参考深入理解 Python 的 copy() 函数:浅拷贝与深拷贝详解-CSDN博客


五、类型层级与继承关系

Python 的类型系统是一个类的层级体系
所有类型都继承自 object

object├── int├── float├── bool├── str├── tuple├── list├── dict├── set├── frozenset└── complex

验证:

print(isinstance(10, object))     # True
print(isinstance("hello", object))# True
print(isinstance([1,2,3], object))# True

一切皆对象(Everything is an Object) 并不是一句口号,而是 Python 运行机制的根基。


六、类型之间的相互关系与转换

Python 提供了灵活的类型转换函数

转换函数示例结果
int()int(3.14)3
float()float('2.5')2.5
str()str(123)'123'
list()list('abc')['a', 'b', 'c']
tuple()tuple([1,2,3])(1, 2, 3)
set()set([1,2,2,3]){1, 2, 3}
dict()dict([('a', 1), ('b', 2)]){'a': 1, 'b': 2}

这些函数底层都是调用各类型的构造函数(如 list.__init__())。


七、数据类型与内存模型

Python 采用引用计数机制 + 垃圾回收(GC) 管理内存。

  • 每个对象都维护一个引用计数;
  • 当计数归零时,对象自动销毁;
  • 可变对象在原地修改时不会改变引用;
  • 不可变对象在“修改”时会创建新对象。
import sys
a = 1000
b = a
print(sys.getrefcount(a))  # 查看引用次数

http://www.dtcms.com/a/511457.html

相关文章:

  • All in One Runtimes下载和安装图解(附安装包,适合新手)
  • Python多patch装饰器使用指南
  • Prometheus监控系统
  • 【Java-集合】Set接口
  • 安卓开发- Log日志工具类
  • 微信链接的微网站怎么做的wordpress注册邮件设置密码
  • 国学大师网站谁做的wordpress dante
  • asp.net网站开发 vs2017手机网站分页
  • 传统决策vs AI决策:效率之争的底层逻辑与正确选择
  • SecurityContext在分布式系统(如微服务)中如何传递?有哪些常见方案?
  • MinIO与HDFS对比测试
  • SAP SD销售订单创建接口分享
  • rabbitMQ 的安装和使用
  • 华为Java专业级科目一通过心得
  • [Android] AutoCMD+ v.1.3.5:安卓自动化工具
  • 从养殖场到实验室:小吉快检BL-08plus如何实现禽病检测效率提升300%?——真实案例深度解析
  • 衡阳手机网站建设外发加工费计入什么科目
  • 【JUnit实战3_06】第三章:JUnit 的体系结构(下)
  • 使用injected Provider在remix中调试合约的坑 -- 时间(或者最新块)更新不及时
  • 丽水市莲都建设分局网站湖南微网站开发
  • 笔试-最小组合数
  • Web UI自动化时,通过autoIT的解决window控件
  • 电商网站建设建议网站前端交互功能案例分析
  • Qt——窗口
  • [人工智能-大模型-20]:对比 Copilot 与国产替代方案(如通义灵码、百度Comate)
  • c语言和网站建设的关系平台网站开发可行性分析
  • gcc编译的过程及每个过程的作用
  • ROS2[Humble] -- URDF Tutorial- 02-multipleshapes
  • C#实现二维码和条形码生成与打印
  • C#WPF如何跳转页面