Python 3 是 Python 语言的现在和未来,Python 2 已在 2025 年 1 月 1 日正式停止维护,这意味着它不再接收任何更新、修复或安全补丁,所有新的开发项目都应该使用 Python 3。

为什么会有 Python 3?
Python 3 的诞生是为了解决 Python 2 中存在的一些设计缺陷和“历史包袱”,主要是为了:
- 消除语言中的歧义和不一致性:整数除法、
print语句等。 - 改进 Unicode 支持:Python 2 的 Unicode 处理非常混乱,而 Python 3 从根本上解决了这个问题。
- 清理代码库:移除了一些过时和不推荐的模块和功能。
- 为语言的长期发展奠定基础:Python 3 的设计更具前瞻性,更容易进行后续的功能扩展。
Python 2 vs Python 3:主要区别
下面是两者之间最核心、最显著的区别。
a. print 语句 vs print() 函数
这是最直观的区别。
- Python 2:
print是一个语句,不需要括号。print "Hello, World!" print "Hello", "World" # 输出: Hello World (带空格分隔)
- Python 3:
print是一个函数,必须使用括号。print("Hello, World!") print("Hello", "World") # 输出: Hello World (带空格分隔) # 注意:print("Hello", "World", sep="") 可以去掉空格
b. 整数除法
这是 Python 2 中一个非常常见的陷阱。

- Python 2: 两个整数相除,结果会截断小数部分,返回一个整数。
>>> 5 / 2 2 # 结果是整数 2,而不是 2.5
- Python 3: 除法 总是返回一个浮点数,如果需要整数除法,使用 运算符。
>>> 5 / 2 2.5 # 结果是浮点数 2.5 >>> 5 // 2 2 # // 是整数除法
c. Unicode vs. Bytes (字符串处理)
这是两者之间最重要的区别,也是从 Python 2 迁移到 Python 3 最困难的部分。
-
Python 2:
- 有两种字符串类型:
str和unicode。 str是字节串,直接存储原始字节。unicode是 Unicode 字符串,是抽象的字符表示。- 这导致了大量的编码/解码问题,
UnicodeDecodeError和UnicodeEncodeError。# Python 2 s = "你好" # 这是一个 str (字节串),通常编码是 ASCII 或系统默认编码 u = u"你好" # 这是一个 unicode # s 包含非 ASCII 字符,直接拼接会报错 # "hello" + s # 可能会报错
- 有两种字符串类型:
-
Python 3:
- 只有一种字符串类型:
str,它表示 Unicode 字符串。 - 引入了
bytes类型来表示字节串。 - 字符串和字节串之间的转换是明确且必须的。
# Python 3 s = "你好" # 这是一个 str (Unicode 字符串) b = s.encode('utf-8') # 将 Unicode 字符串编码成字节串 print(b) # 输出: b'\xe4\xbd\xa0\xe5\xa5\xbd'
s2 = b.decode('utf-8') # 将字节串解码成 Unicode 字符串 print(s2) # 输出: 你好
(图片来源网络,侵删) - 只有一种字符串类型:
d. xrange vs range
- Python 2:
range()返回一个完整的列表,当数字很大时会消耗大量内存。xrange()返回一个迭代器,它不会一次性生成所有数字,更节省内存。# Python 2 r = xrange(1000000) # 节省内存 l = range(1000000) # 可能会占用大量内存
- Python 3:
range()的行为和 Python 2 的xrange()一样,返回一个迭代器。xrange()不再存在。# Python 3 r = range(1000000) # 节省内存,是一个 range 对象(迭代器) # l = list(range(1000000)) # 如果需要列表,可以显式转换
e. 异常处理语法
- Python 2: 使用逗号来捕获异常变量。
# Python 2 try: # something except ValueError, e: # 语法是 except <Exception>, <variable> print(e) - Python 3: 使用
as关键字,这与其他现代语言(如 Java, C#)的语法一致。# Python 3 try: # something except ValueError as e: # 语法是 except <Exception> as <variable> print(e)
f. 迭代器 .next() 方法
- Python 2: 迭代器有一个
.next()方法来获取下一个元素。# Python 2 my_iter = iter([1, 2, 3]) print(my_iter.next()) # 输出: 1
- Python 3:
.next()方法被内置的next()函数取代。# Python 3 my_iter = iter([1, 2, 3]) print(next(my_iter)) # 输出: 1 # 为了向后兼容,迭代器也保留了 __next__ 方法
g. 其他重要区别
| 特性 | Python 2 | Python 3 |
|---|---|---|
| 输入函数 | raw_input() |
input() (Python 2 的 input() 有安全风险) |
字典的 .keys(), .values(), .items() |
返回列表 | 返回视图对象,更节省内存 |
map, filter, zip |
返回列表 | 返回迭代器 |
super() |
super(ChildClass, self).method() |
super().method() (更简洁) |
| 运算符 | 整数除法 | 真除法 |
import 语句 |
相对导入语法 from . import module |
相对导入语法更清晰 |
如何处理兼容性问题?(__future__ 导入)
在 Python 2 的后期版本中,可以通过 __future__ 模块来导入 Python 3 的某些特性,从而让 Python 2 代码更接近 Python 3 的写法,便于后续迁移。
# Python 2 代码
from __future__ import print_function # 使用 print() 函数语法
from __future__ import division # 使用 Python 3 的除法规则
print("Hello")
print(5 / 2) # 输出 2.5
迁移指南
如果你有一个旧的 Python 2 项目,需要迁移到 Python 3,可以遵循以下步骤:
-
使用自动化工具:
2to3: Python 自带的工具,可以自动将大部分 Python 2 代码转换为 Python 3 代码,但它不是万能的,特别是对于 Unicode 和第三方库的处理。modernize: 一个更智能的第三方工具,它会使用__future__导入和一些其他技巧,让代码在 Python 2 和 Python 3 上都能运行,为最终迁移到 Python 3 铺路。six: 一个兼容性库,让你可以在代码中同时支持 Python 2 和 Python 3,但通常不推荐在新项目中使用,因为它增加了代码的复杂性。
-
手动修改:自动化工具无法处理所有问题,特别是:
- 字符串处理:这是最需要手动审查和修改的部分,确保所有文本数据都使用
unicode(Python 2) 或str(Python 3),所有二进制数据都使用bytes。 - 第三方库:检查你使用的所有第三方库是否已经提供了 Python 3 版本,许多库已经停止支持 Python 2。
- API 变更:仔细检查代码中使用了哪些在 Python 3 中被移除或改变行为的函数/方法。
- 字符串处理:这是最需要手动审查和修改的部分,确保所有文本数据都使用
总结与建议
| Python 2 | Python 3 | |
|---|---|---|
| 状态 | 已停止维护 (EOL) | 当前和未来 |
| 安全 | 有安全风险 | 安全 |
| 社区 | 停止更新,新包越来越少 | 活跃,所有新包都支持 |
| 特性 | 有历史包袱,设计不一致 | 现代化,清晰,一致 |
给开发者的最终建议:
- 新项目:绝对不要再使用 Python 2,直接选择 Python 3,目前最新的稳定版本是 Python 3.10+,它们带来了许多优秀的性能改进和新特性(如海象运算符 、模式匹配等)。
- 维护旧项目:如果必须维护一个 Python 2 项目,首要任务是制定一个迁移计划,并尽快迁移到 Python 3,不要指望 Python 2 会“一直工作下去”,它随时可能出现无法修复的安全漏洞。
- 学习:如果你是初学者,请直接学习 Python 3,市面上绝大多数优质教程、书籍和课程都是基于 Python 3 编写的。
一句话总结:拥抱 Python 3,它是 Python 语言发展的正确方向。
