Python
語法和语义 > 类型

Python使用鸭子类型，并拥有有类型的对象，和无类型的变量名字。在编译期不检查类型约束，而宁愿在一个对象上的操作出现可能的失败，表现出这个给定对象不具有适合的类型。尽管是动态类型系统，Python却是强类型的，禁止没有明确定义的操作（比如加一个数到一个字符串），而不是默默的去尝试转换使其有意义。Python支持广泛的类型和类的内省。类型是type的实例，可以被读取和比较。
Python有着范围广泛的基本数据类型。同时具备常规的整数和浮点算术，它透明的支持任意精度算术、复数和十进制浮点数（英语：）。Python支持种类繁多的字符串操作。在Python中，字符串是不可变的，所以在其他编程语言中可能就地改变字符串的字符串操作，比如字符替换，在Python中返回新的字符串。
Python有一个非常有用特征，就是搜集（或称容器）类型的概念。一般的说，搜集是以一种易于引用或索引的方式，包含其他对象的对象。搜集有二种基本形式：序列和映射。Python对建立容器类型的对象有着语法上的支持。Python还提供了广泛的搜集操纵能力，比如内建的包含元素检查和通用迭代协议。
有次序的序列类型是列表（动态数组（英语：））、元组和字符串。所有序列类型都是位置索引的（从0到长度−1），并且除了字符串，都可以包含任意类型的对象，在同一个序列中包括多种类型的对象。字符串和元组是不可变的，使得它们成为字典的键的完美候选者。在另一方面，列表是可变的，元素可以被插入、删除、修改、添加或就地排序。
在另一方面，映射是以“字典”形式实现的无次序的类型，它将一组不可变的键，映射到相应的元素上（非常像数学函数）。在字典中的键，必须是不可变的Python类型，比如整数或字符串，因为在底层它们是通过散列函数实现的。字典还是语言内部的中心，因为它们居于所有Python对象和类的核心：在变量名字（字符串）和这个名字所引用的值之间的映射，就存储为字典，而这些字典可以通过对象的__dict__特性直接访问。
集合（英语：）搜集类型，在版本2.4中被增加入语言核心。集合是无索引、无次序的搜集，它包含唯一性的不可变对象作为元素，并且实现了集合论运算，比如并集|、交集&、相对补集-、对称差^，和子集测试<=、真子集测试<、超集测试>=、真超集测试>。有二种类型的集合：可变的set和不可变的frozenset。
Python允许编程者使用类，定义自己的类型，类是在面向对象编程中最经常使用的。类的新实例，是通过调用这个类的构造器而创建的，而类都是元类type的实例，type是type元类自身的实例，这允许了元编程和反射。
在版本3.0之前，Python有两种类：旧式的和新式的。二种样式的语法是一样的，不同在于是否直接或间接的继承自类object，所有新式类都从object继承，并且是type的实例。在Python 2系列2.2以上，二种类都可以使用。在Python 3.0中淘汰了旧式类。
长期规划是支持渐进类型（英语：），并且自从Python 3.5，语言的语法允许指定静态类型，但在缺省实现CPython中不检查它们。有叫做“mypy”的可选的静态类型检查器，支持编译期类型检查。
| 类型 | 可变性 | 描述 | 语法例子 |
| --- | --- | --- | --- |
| bool | 不可变 | 布尔值，有表示值False和True的两个对象。作为整数类型numbers.Integral的子类型，它们在几乎所有上下文中，表现得如同0和1，除了在转换成字符串时转换为"False"和"True"之外。 | True False |
| int | 不可变 | 整数，其大小在理论上无限制，实际上受限于内存。 | 42 |
| float | 不可变 | 双精度浮点数，确切精度依赖于机器。一般实现为IEEE 754标准binary64浮点数，它有53个二进制有效数位精度。 | 1.414 |
| complex | 不可变 | 複數，即分别表示实部与虚部的两个双精度浮点数的有序对。 | 3+2.7j |
| range | 不可变 | 数的序列，通常用在for循环中指定循环次数。 | range(1, 10) range(10, -5, -2) |
| str | 不可变 | 字符串，即Unicode代码点序列。字符串中的代码点都在范围U+0000..U+10FFFF之内。Python没有char类型，这些代码点都表示为长度为1的字符串对象。 | 'Wikipedia' "Wikipedia" """Spanning multiple lines"""  |
| bytes | 不可变 | 字节序列，其项目是8位字节，用范围0 <= x < 256的整数表示。 | b'Some ASCII' b"Some ASCII" bytes([0x53, 0x74, 0x72]) |
| bytearray | 可变 | 字节序列，其项目是8位字节，用范围0 <= x < 256的整数表示。 | bytearray(b'Some ASCII') bytearray(b"Some ASCII") bytearray([0x53, 0x74, 0x72]) |
| list | 可变 | 列表，可以包含任意的Python对象。 | [4.0, 'string', True] [] |
| tuple | 不可变 | 元组，可以包含任意的Python对象。只有一个项目的元组，可以通过向表达式后缀一个逗号来形成。 | (4.0, 'string', True) ('single element',) () |
| dict | 可变 | 键-值对的关联数组（常称为字典），即由任意索引集合来索引的对象的有限集合（英语：）。不可接受为键的值，是列表或字典，或按值而非对象同一性比较的其他可变类型的值，其散列值不能保持恒定。 | {'key1': 1.0, 3: False} {} |
| set | 可变 | 无序有限集合（英语：），包含唯一性的不可变的对象，它们不能用任何下标来索引。 | {4.0, 'string', True} set() |
| frozenset | 不可变 | 无序有限集合（英语：），包含唯一性的不可变的对象，它们不能用任何下标来索引。 | frozenset([4.0, 'string', True]) |
| types.EllipsisType | 不可变 | 这个类型有一个单一对象作为值，它通过文字...或内建名字Ellipsis（英语：）来访问，它的真值为真。它用于NumPy多维阵列索引。 | ... Ellipsis |
| types.NoneType | 不可变 | 这个类型有叫做None的一个单一对象Null作为值，它被用来指示值的缺席，比如不返回任何东西的函数返回它，它的真值为假。 | None |
| types.NotImplementedType | 不可变 | 这个类型有一个单一对象NotImplemented作为值。数值方法和细化比较方法，在它们仍未对提供的运算元实现这个运算之时，返回这个值。它不应该在布尔值上下文中求值。 | NotImplemented |
除了各种数据类型，Python解释器还内建了很多其他类型，包括可调用类型：用户定义函数、实例方法、生成器函数、协程函数、异步生成器函数、内建函数、内建方法、类、类方法；模块，定制类，类实例，I/O对象（也叫做文件对象），和暴露给用户的一些内部类型：代码对象、框架对象、溯回对象、切片对象、静态方法对象、类方法对象。