Python 3 是 Python 语言的现在和未来,而 Python 2.7 是一个遗留版本,已于 2025 年 1 月 1 日停止官方支持。

所有新的项目都应该使用 Python 3,只有在维护旧的、无法迁移的 Python 2.7 项目时,才需要继续使用它。
历史背景与生命周期
-
Python 2.7:
- 发布于 2010 年,是 Python 2.x 系列的最后一个主要版本。
- 它被设计为一个“过渡版本”,旨在帮助开发者从 Python 2 迁移到 Python 3。
- 关键日期: 2025 年 1 月 1 日,Python 软件基金会 官方宣布停止对 Python 2.7 的支持,这意味着它不再接收安全补丁、错误修复或任何改进。
- 现状: 虽然很多旧系统仍在运行,但使用它意味着面临安全风险和无法使用新功能的困境。
-
Python 3:
- 发布于 2008 年,是 Python 语言的重大重构和升级。
- 它旨在修正 Python 2 中设计上的缺陷和不一致性,并清理语言的核心。
- 现状: 这是目前所有新项目唯一推荐的版本,它持续不断地获得新功能、性能优化和安全更新,最新的稳定版本是 Python 3.12(截至 2025 年底)。
最核心、最不兼容的变更
Python 3 和 Python 2.7 之间最大的、也是最著名的区别在于处理整数除法的方式。

整数除法
-
Python 2: 两个整数相除,结果会自动向下取整,得到一个整数。
# Python 2 >>> 5 / 2 2
如果你想得到浮点数结果,必须将其中一个数转换为浮点数:
# Python 2 >>> 5.0 / 2 2.5 >>> 5 / 2.0 2.5
-
Python 3: 两个整数相除,结果会得到一个浮点数,这更符合数学直觉。
# Python 3 >>> 5 / 2 2.5
如果你需要像 Python 2 那样进行“地板除”(向下取整),你需要使用 运算符:
(图片来源网络,侵删)# Python 3 >>> 5 // 2 2
print 语句 vs. print() 函数
-
Python 2:
print是一个语句,不是函数。# Python 2 >>> print "Hello, World" >>> print "Hello", "World" # 输出: Hello World (带空格分隔)
-
Python 3:
print是一个函数,必须使用括号。# Python 3 >>> print("Hello, World") >>> print("Hello", "World") # 输出: Hello World (带空格分隔) # 如果不希望有分隔符 >>> print("Hello", "World", sep="")
其他重要区别
| 特性 | Python 2.7 | Python 3 | 解释 |
|---|---|---|---|
| 编码 | 源码文件默认是 ASCII,非 ASCII 字符需要在文件顶部声明 # -*- coding: utf-8 -*-。 |
源码文件默认是 UTF-8,不再需要声明编码。 | Python 3 从根本上解决了字符串和字节流的混乱问题。 |
| 字符串 | str 类型是字节串,unicode 类型是 Unicode 字符串。 |
str 类型是 Unicode 字符串,bytes 类型是字节串。 |
这是更清晰的设计,处理文本用 str,处理二进制数据用 bytes。 |
| 异常处理 | except Exception, e: (逗号分隔) |
except Exception as e: (as 关键字) |
as 是更符合 Python 风格的语法,与 with 语句保持一致。 |
xrange() |
xrange() 返回一个 xrange 对象(惰性计算),比 range() 更节省内存。 |
range() 返回的是一个 range 对象(惰性计算),等同于 Python 2 的 xrange()。 |
Python 3 移除了 range(),统一使用高效的 range()。 |
input() vs raw_input() |
input() 会将输入作为 Python 代码执行,有安全风险。raw_input() 总是返回字符串。 |
input() 总是返回字符串,等同于 Python 2 的 raw_input()。 |
Python 3 移除了有安全风险的 input() 行为。 |
| 字典迭代 | dict.keys(), dict.values(), dict.items() 返回的是列表。 |
dict.keys(), dict.values(), dict.items() 返回的是视图对象(view objects),是动态的、惰性的。 |
视图对象更节省内存,并且能反映字典的实时变化,如果需要列表,可以显式地用 list() 转换。 |
super() |
super(ChildClass, self).method() |
super().method() |
Python 3 的 super() 更简洁,能自动处理参数查找。 |
| 列表推导式作用域 | 列表推导式会创建一个新的局部作用域。 | 列表推导式不再创建新的作用域,它所在函数的变量可以在列表推导式中访问。 | 这是一个行为上的细微但重要的变化。 |
如何迁移?
如果你有一个 Python 2.7 的项目,并且希望迁移到 Python 3,可以遵循以下步骤:
-
使用自动化工具:
2to3: Python 自带的一个工具,可以自动将大部分 Python 2 代码转换为 Python 3 代码,但它不是万能的,可能无法处理所有情况。modernize: 一个更智能的工具,它会尝试将代码改写成同时兼容 Python 2 和 Python 3 的风格,而不仅仅是转换语法。
-
使用兼容库:
six: 这是一个非常流行的库,提供了用于编写兼容 Python 2 和 Python 3 代码的实用工具和包装器,对于无法立即完成迁移的大型项目,这是一个很好的过渡方案。future: 另一个类似的库,旨在帮助平滑过渡。
-
手动修改和测试:
- 自动化工具不是完美的,迁移后,必须进行全面的测试,特别是处理文件 I/O、网络数据和复杂逻辑的部分,因为很多不兼容的问题(如编码、除法)在这些地方容易出现。
总结与建议
| 对比维度 | Python 2.7 | Python 3 | |
|---|---|---|---|
| 状态 | 已停止支持 (EOL) | 活跃开发,持续更新 | 选择 Python 3 是唯一明智的选择。 |
| 语法 | 有一些过时且不一致的语法 | 现代、清晰、一致 | Python 3 的语法更符合现代编程语言的设计理念。 |
| 库支持 | 大量旧库仅支持 Python 2 | 几乎所有新库和主流库都优先支持 Python 3 | Python 3 拥有更强大的生态系统和未来。 |
| 社区 | 社区活跃度下降 | 社区庞大且活跃,是未来的主流 | 学习 Python 3 能让你获得更多的帮助和资源。 |
| 未来 | 无未来 | 就是未来 | 投资学习 Python 3 是一项有远见的投资。 |
最终建议:
- 对于初学者: 直接学习 Python 3,不要浪费时间在 Python 2 上,因为它已经过时,并且会给你带来很多过时的、不必要的认知负担。
- 对于开发者: 如果你的项目是新的,或者可以承受迁移成本,立即迁移到 Python 3,如果必须维护一个遗留的 Python 2.7 项目,请务必做好安全防护,并制定一个迁移计划。
- 对于企业: 应该制定计划,将所有遗留的 Python 2.7 应用迁移到 Python 3,以消除安全风险并利用新技术带来的好处。
