数据类型
在 JavaScript 中,我们有基本类型(number
、string
、boolean
、undefined
、null
、symbol
)和引用类型(object
,包括数组、函数等)。Python 也有数据类型的概念,但分类方式和 JavaScript 不同,更加细致和清晰。
对比 JavaScript
Python 和 JavaScript 在类型系统设计上有重要差异:
JavaScript 的类型系统:
- 分为基础类型(number, string, boolean, null, undefined)和引用类型(object, array, function)
- 基础类型按值传递,引用类型按引用传递
- 有很多隐式类型转换,有时会产生意外结果
Python 的类型系统:
- 所有数据都是对象,没有基础类型和引用类型的区别
- 更重要的是 可变(mutable) 和 不可变(immutable) 的区别
- 很少有隐式转换,大多需要显式转换,更加安全可预测
可变性:Python 的核心概念
Python 中,数据类型按可变性分为两大类。理解这个概念的关键是:变量只是指向对象的标签,可变性说的是对象本身能否被修改。
不可变类型(Immutable):
- 对象一旦创建,对象内容不能修改
- 包括:
int
、float
、str
、bool
、tuple
、frozenset
- 变量可以指向新对象,但原对象不变
可变类型(Mutable):
- 对象创建后,对象内容可以修改
- 包括:
list
、dict
、set
- 可以直接修改对象内部的数据
让我们用具体例子来理解这个概念:
再看一个更清楚的对比:
这就像 JavaScript 中的基本类型 vs 引用类型:
内置数据类型
Python 默认包含以下几类数据类型:
类型分类 | 数据类型 | 可变性 |
---|---|---|
文本类型 | str | 不可变 |
数值类型 | int , float , complex | 不可变 |
序列类型 | list , tuple , range | list 可变,其他不可变 |
映射类型 | dict | 可变 |
集合类型 | set , frozenset | set 可变,frozenset 不可变 |
布尔类型 | bool | 不可变 |
二进制类型 | bytes , bytearray , memoryview | bytes 不可变,其他可变 |
空值类型 | NoneType | 不可变 |
获取数据类型
就像 JavaScript 中使用typeof
一样,Python 使用type()
函数来查看数据类型:
type()
返回的是类对象,形如 <class 'int'>
,这种格式不够直观,也无法直接进行字符串比较。如果需要获取类型名称的字符串形式,可以使用 type().__name__
:
数据类型的自动识别
在 JavaScript 中,变量的类型是在赋值时确定的,Python 也是如此:
显式指定数据类型
有时我们想要明确指定变量的数据类型,可以使用构造函数:
类型检查
在实际编程中,我们经常需要检查变量的类型。Python 提供了两种主要方式:type()
和isinstance()
。推荐使用isinstance()
函数,因为它能正确处理继承关系,更加安全可靠。
isinstance()
可以检查单一类型,也可以同时检查多种类型,非常灵活:
检查None
值有特殊的语法。JavaScript 中我们用=== null
,Python 中应该使用is None
:
isinstance()
相比type()
的优势在于能正确处理继承关系:
类型转换
与 JavaScript 的隐式转换不同,Python 主要依赖显式转换,这让代码更加安全和可预测。JavaScript 中经常出现的"5" + 3 = "53"
这样的意外结果,在 Python 中需要明确指定转换方式:
小结
Python 的数据类型体系与 JavaScript 有显著差异,主要体现在:
- 类型系统差异:Python 中所有数据都是对象,更关注可变性而非基础类型 vs 引用类型
- 可变性概念:不可变类型(int、str、tuple 等)创建后不可修改,可变类型(list、dict、set 等)可以修改内容
- 类型识别:
type()
函数查看类型,isinstance()
函数进行类型检查(推荐) - 显式转换:Python 避免隐式转换,通过构造函数进行明确的类型转换
- 更细致的分类:数值类型分为 int、float、complex,序列类型包含 list、tuple、range 等
- 内置集合支持:set 和 frozenset 提供高效的集合操作
- 类型安全:较少的隐式转换规则让代码行为更可预测
理解这些概念,特别是可变性和类型检查,是掌握 Python 编程的重要基础。在后续章节中,我们将深入学习每种具体类型的用法和特性。
练习
创建不同类型的变量,练习类型检查和转换: