Python的数据结构详细讲解

Python 提供了丰富的数据类型,每种类型都有其特定的用途和操作方式。以下是 Python 主要数据类型的详细讲解,分为 不可变类型可变类型 两大类。在Python里面的数据类型都是对象


Python 变量本质:一切都是对象的引用

在 Python 中,所有变量都是对内存中对象的引用(类似 Java 中的“引用类型”)。
但关键区别在于:Python 没有基本数据类型,所有类型(包括数字、字符串)都是对象,存储在堆内存中。变量名是存储在栈内存里面指向真正存储数据的对应的堆内存里面。


在这里插入图片描述


一、不可变数据类型

不可变类型的值一旦创建,便不能被修改(但可以重新赋值)。意思就是如果你创建了一个不可变数据类型当你需要修改他的时候,这个变量会重新指向你新创建的这个对象

1. 数字类型(Numbers)
  • 整型(int:如 5, -3, 1000。Python 3 中整数没有大小限制。
  • 浮点型(float:如 3.14, -0.001, 2.5e5(科学计数法)。
  • 复数(complex:如 1 + 2j3j
  • 布尔型(bool:是 int 的子类,只有 TrueFalse

示例

a = 10          # int
b = 3.14        # float
c = 1 + 2j      # complex
d = True        # bool

2. 字符串(str
  • 用单引号 ' '、双引号 " " 或三引号 ''' ''' 定义。
  • 支持索引、切片,但不可修改字符。
  • 常用方法:split(), join(), format(), strip() 等。

示例

s = "Hello, Python"
print(s[0])     # 输出 'H'
s = s.replace("Python", "World")  # 创建新字符串

3. 元组(tuple
  • ( ) 定义,元素不可修改,但可以包含可变对象(如列表)。
  • 常用于不可变数据集合或函数返回多个值。

示例

t = (1, "apple", [3, 4])
t[2][0] = 5     # 修改元组内的列表是允许的

二、可变数据类型

可变类型的值可以在不创建新对象的情况下修改。

1. 列表(list
  • [ ] 定义,元素可增删改。
  • 支持索引、切片、迭代,常用方法:append(), insert(), pop(), sort()

示例

lst = [1, 2, 3]
lst[0] = 10      # 修改元素
lst.append(4)    # 添加元素

2. 字典(dict
  • { } 定义,存储键值对(key: value),键必须为不可变类型。
  • 快速查找数据,常用方法:keys(), values(), items(), get()

示例

d = {"name": "Alice", "age": 25}
d["age"] = 26    # 修改值
d["city"] = "NY" # 添加新键值对

3. 集合(set
  • { }set() 定义,元素唯一且无序,支持集合运算(并集、交集等)。
  • 常用方法:add(), remove(), union(), intersection()

示例

s = {1, 2, 3}
s.add(4)        # 添加元素
s.discard(2)    # 移除元素

三、其他特殊类型

1. NoneType(None
  • 表示空值,只有一个实例 None,常用于初始化变量。
2. 字节(bytesbytearray
  • bytes 不可变,bytearray 可变,用于处理二进制数据。

四、类型转换

Python 提供内置函数进行类型转换:

int("123")      # 字符串 → 整型 123
str(3.14)       # 浮点数 → 字符串 "3.14"
list("abc")     # 字符串 → 列表 ['a', 'b', 'c']
tuple([1,2,3])  # 列表 → 元组 (1,2,3)

五、可变 vs 不可变

类型可变性示例
数字(int, float, complex)不可变x = 5
字符串(str)不可变s = "hello"
元组(tuple)不可变t = (1, 2)
列表(list)可变lst = [1, 2]
字典(dict)可变d = {"key": "value"}
集合(set)可变s = {1, 2}

六、java里面基础类型和python的数据类型

Python 类型Java 对应类型底层结构差异
intint (基本类型) / Integer (包装类)Python int 支持任意精度(类似 Java BigInteger),Java int 是固定 32 位二进制补码
floatdouble (基本类型) / Double均为 IEEE 754 双精度浮点数,但 Java 有单独的 float (单精度)
boolboolean (基本类型) / BooleanPython 的 boolint 子类(True=1, False=0),Java 的 boolean 是独立类型
strStringPython 3 的 str 是不可变 Unicode,Java String 也是不可变,但编码实现可能不同(如 Java 9+ 的紧凑字符串优化)
NonenullPython 的 None 是单例对象,Java 的 null 是表示空引用的关键字

七、python容器类型对应 java里面集合数据类型

Python 类型Java 对应类型底层结构差异
listArrayList / LinkedListPython list 是动态数组,类似 ArrayList;若需链表行为则对应 LinkedList
tuple无直接对应,可用 List + 不可变包装Python 的 tuple 是不可变序列,Java 可用 Collections.unmodifiableList 或第三方库(如 Guava 的 ImmutableList
dictHashMap / LinkedHashMap均为哈希表实现,但 Python 用开放寻址法解决冲突,Java 8+ 的 HashMap 使用链表+红黑树
setHashSet / LinkedHashSetPython set 基于哈希表,Java HashSet 同理;有序集合对应 LinkedHashSet
frozensetCollections.unmodifiableSetPython 的不可变集合,Java 通过包装实现

八、其他类型

Python 类型Java 对应类型底层结构差异
bytesbyte[]Python bytes 是不可变字节序列,Java 的 byte[] 是可变数组
bytearrayByteArrayOutputStreamPython 的可变字节序列,Java 需通过 ByteBuffer 或 I/O 类模拟
自定义类实例自定义类实例Python 类的动态特性(如运行时修改)与 Java 类的静态结构差异显著

九、底层结构一致性分析

  1. 数值类型

    • Python 的 int 是任意精度对象(类似大整数),而 Java 的 int 是固定 32 位;只有小整数时底层可能与 Java int 类似。
    • 浮点数底层均为 IEEE 754,但 Java 有明确区分 floatdouble
  2. 字符串

    • Python 3 的 str 存储为 Unicode 码点(类似 UTF-32),Java 的 String 在 JDK 9+ 使用紧凑存储(Latin-1 或 UTF-16)。
  3. 动态数组(List vs ArrayList)

    • 两者均基于动态扩容数组,但 Python list 的扩容策略(过度分配)和内存布局(存储对象引用)与 Java ArrayList 类似。
  4. 哈希表(Dict vs HashMap)

    • 均使用哈希表,但冲突解决策略不同:Python 用开放寻址法,Java 8+ 的 HashMap 在桶冲突时转为红黑树。
  5. 不可变类型

    • Python 的 tuplestr 等天然不可变,Java 需通过包装类或设计模式(如防御性拷贝)实现类似效果。

十、关键差异总结

  1. 类型系统

    • Python 动态类型,所有值均为对象;Java 静态类型,区分基本类型和对象类型。
  2. 内存与性能

    • Java 的基本类型(如 int)直接在栈上分配,效率更高;Python 的所有类型均为堆分配对象。
  3. 扩展性

    • Python 的容器可混合存储不同类型,Java 容器需指定泛型类型(如 List<String>)。
  4. 不可变性

    • Python 通过内置类型(如 tuple)直接支持不可变,Java 需依赖 API 或第三方库。

十一、示例代码对比

# Python
values = [1, "hello", 3.14]  # 混合类型列表
d = {"key": "value", 42: True}
s = {1, 2, 3}
// Java
List<Object> values = new ArrayList<>();  // 需用 Object 泛型
values.add(1);
values.add("hello");
values.add(3.14);

Map<Object, Object> d = new HashMap<>();
d.put("key", "value");
d.put(42, true);

Set<Integer> s = new HashSet<>();
s.add(1);
s.add(2);
s.add(3);

总结

虽然 Python 和 Java 的数据类型在功能上可以找到对应关系,但由于语言设计哲学不同(动态 vs 静态、脚本语言 vs 编译语言),底层实现和性能特征存在显著差异。理解这些差异有助于在跨语言开发或性能优化时做出合理选择。

掌握这些数据类型及其操作,是编写高效 Python 程序的基础!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值