Python 提供了丰富的数据类型,每种类型都有其特定的用途和操作方式。以下是 Python 主要数据类型的详细讲解,分为 不可变类型 和 可变类型 两大类。在Python里面的数据类型都是对象:
Python 变量本质:一切都是对象的引用
在 Python 中,所有变量都是对内存中对象的引用(类似 Java 中的“引用类型”)。
但关键区别在于:Python 没有基本数据类型,所有类型(包括数字、字符串)都是对象,存储在堆内存中。变量名是存储在栈内存里面指向真正存储数据的对应的堆内存里面。

一、不可变数据类型
不可变类型的值一旦创建,便不能被修改(但可以重新赋值)。意思就是如果你创建了一个不可变数据类型当你需要修改他的时候,这个变量会重新指向你新创建的这个对象
1. 数字类型(Numbers)
- 整型(
int):如5,-3,1000。Python 3 中整数没有大小限制。 - 浮点型(
float):如3.14,-0.001,2.5e5(科学计数法)。 - 复数(
complex):如1 + 2j,3j。 - 布尔型(
bool):是int的子类,只有True和False。
示例:
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. 字节(bytes 和 bytearray)
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 对应类型 | 底层结构差异 |
|---|---|---|
int | int (基本类型) / Integer (包装类) | Python int 支持任意精度(类似 Java BigInteger),Java int 是固定 32 位二进制补码 |
float | double (基本类型) / Double | 均为 IEEE 754 双精度浮点数,但 Java 有单独的 float (单精度) |
bool | boolean (基本类型) / Boolean | Python 的 bool 是 int 子类(True=1, False=0),Java 的 boolean 是独立类型 |
str | String | Python 3 的 str 是不可变 Unicode,Java String 也是不可变,但编码实现可能不同(如 Java 9+ 的紧凑字符串优化) |
None | null | Python 的 None 是单例对象,Java 的 null 是表示空引用的关键字 |
七、python容器类型对应 java里面集合数据类型
| Python 类型 | Java 对应类型 | 底层结构差异 |
|---|---|---|
list | ArrayList / LinkedList | Python list 是动态数组,类似 ArrayList;若需链表行为则对应 LinkedList |
tuple | 无直接对应,可用 List + 不可变包装 | Python 的 tuple 是不可变序列,Java 可用 Collections.unmodifiableList 或第三方库(如 Guava 的 ImmutableList) |
dict | HashMap / LinkedHashMap | 均为哈希表实现,但 Python 用开放寻址法解决冲突,Java 8+ 的 HashMap 使用链表+红黑树 |
set | HashSet / LinkedHashSet | Python set 基于哈希表,Java HashSet 同理;有序集合对应 LinkedHashSet |
frozenset | Collections.unmodifiableSet | Python 的不可变集合,Java 通过包装实现 |
八、其他类型
| Python 类型 | Java 对应类型 | 底层结构差异 |
|---|---|---|
bytes | byte[] | Python bytes 是不可变字节序列,Java 的 byte[] 是可变数组 |
bytearray | ByteArrayOutputStream 等 | Python 的可变字节序列,Java 需通过 ByteBuffer 或 I/O 类模拟 |
| 自定义类实例 | 自定义类实例 | Python 类的动态特性(如运行时修改)与 Java 类的静态结构差异显著 |
九、底层结构一致性分析
-
数值类型
- Python 的
int是任意精度对象(类似大整数),而 Java 的int是固定 32 位;只有小整数时底层可能与 Javaint类似。 - 浮点数底层均为 IEEE 754,但 Java 有明确区分
float和double。
- Python 的
-
字符串
- Python 3 的
str存储为 Unicode 码点(类似 UTF-32),Java 的String在 JDK 9+ 使用紧凑存储(Latin-1 或 UTF-16)。
- Python 3 的
-
动态数组(List vs ArrayList)
- 两者均基于动态扩容数组,但 Python
list的扩容策略(过度分配)和内存布局(存储对象引用)与 JavaArrayList类似。
- 两者均基于动态扩容数组,但 Python
-
哈希表(Dict vs HashMap)
- 均使用哈希表,但冲突解决策略不同:Python 用开放寻址法,Java 8+ 的
HashMap在桶冲突时转为红黑树。
- 均使用哈希表,但冲突解决策略不同:Python 用开放寻址法,Java 8+ 的
-
不可变类型
- Python 的
tuple、str等天然不可变,Java 需通过包装类或设计模式(如防御性拷贝)实现类似效果。
- Python 的
十、关键差异总结
-
类型系统
- Python 动态类型,所有值均为对象;Java 静态类型,区分基本类型和对象类型。
-
内存与性能
- Java 的基本类型(如
int)直接在栈上分配,效率更高;Python 的所有类型均为堆分配对象。
- Java 的基本类型(如
-
扩展性
- Python 的容器可混合存储不同类型,Java 容器需指定泛型类型(如
List<String>)。
- Python 的容器可混合存储不同类型,Java 容器需指定泛型类型(如
-
不可变性
- Python 通过内置类型(如
tuple)直接支持不可变,Java 需依赖 API 或第三方库。
- Python 通过内置类型(如
十一、示例代码对比
# 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 程序的基础!
Python数据结构详解及与Java对比
1658

被折叠的 条评论
为什么被折叠?



