Python 2与Python 3是不兼容的两个分支,Python 2已于2020年1月1日停止维护;核心差异包括:print变为函数、字符串与字节严格区分。
python 2 和 python 3 并非简单升级,而是不兼容的两个分支。python 2 已于 2020 年 1 月 1 日正式停止维护,所有新项目都应使用 python 3。理解两者核心差异,有助于阅读旧代码、迁移项目或避免常见坑。
print 变成函数,不再是语句
Python 2 中 print 是语句,直接写 print "hello";Python 3 中它是内置函数,必须加括号:print("hello")。不加括号会报 SyntaxError。
迁移建议:
- 批量替换时注意带逗号的写法(如
print 1, 2)需改为print(1, 2),默认以空格分隔 - 控制换行:Python 2 用逗号结尾抑制换行(
print "a",),Python 3 改用end=""参数:print("a", end="")
字符串与字节严格区分
Python 3 明确区分文本(str)和二进制数据(bytes)。str 默认是 Unicode,bytes 是原始字节序列;Python 2 的 str 实际是字节串,unicode 才表示文本。
常见影响:
立即学习“Python免费学习笔记(深入)”;
- 读文件需显式指定编码(如
open("f.txt", encoding="utf-8")),否则返回bytes -
"abc" + b"def"在 Python 3 中直接报错,必须统一类型(如解码或编码) - 网络通信、序列化等涉及 I/O 的操作,必须明确处理编码转换
整数除法行为改变
Python 2 中 / 对两个整数执行“地板除”(如 5 / 2 → 2),Python 3 中一律执行真除法(5 / 2 → 2.5)。
对应调整:
- 需要整除时,统一用
//(Python 2.2+ 已支持,推荐迁移时就改用) - 代码中若依赖旧除法行为,可临时加
from __future__ import division(仅限 Python 2)
常见内置函数返回类型变化
Python 3 中多个函数不再返回列表,而是返回惰性迭代器,节省内存但不可重复遍历:
-
range()→ 返回range对象(类似迭代器),不是列表;需列表时显式调用list(range(...)) -
map()、filter()、zip()同样返回迭代器,不能直接索引或多次使用 -
dict.keys()、.values()、.items()返回视图对象(view objects),不是列表,但支持集合操作(如&)
不复杂但容易忽略。实际迁移时,建议配合 2to3 工具做初步转换,再逐模块测试,重点关注 I/O、编码、第三方库兼容性。










