Python 3 是 Python 语言的现在和未来,而 Python 2 已在 2025 年 1 月 1 日停止官方支持(EOL),不再更新和维护。 所有新项目都应该使用 Python 3。

下面我将从几个核心方面详细解释它们的区别。
核心区别概览表
| 特性 | Python 2 | Python 3 | 说明 |
|---|---|---|---|
| 官方支持 | 已停止 (EOL) | 活跃开发 | 这是最重要的原因,新项目必须用 Python 3。 |
print 语句 |
print "Hello" |
print("Hello") |
Python 3 中 print 是一个函数,必须加括号。 |
| 整数除法 | 5 / 2 结果是 2 |
5 / 2 结果是 5 |
Python 2 中 是整数除法, 是地板除法,Python 3 中 是真除法。 |
| Unicode 支持 | str 是字节串,unicode 是文本 |
str 是文本,bytes 是字节串 |
Python 3 默认使用 Unicode,更好地处理多语言文本。 |
| 异常处理 | except Exception, e: |
except Exception as e: |
Python 3 使用更符合现代语言习惯的 as 关键字。 |
xrange 函数 |
xrange(10) 生成迭代器 |
range(10) 就是迭代器 |
Python 3 中 range 返回的是一个类似 xrange 的对象,更节省内存。xrange 已被移除。 |
input() 函数 |
input() 会将输入作为代码执行 |
input() 总是将输入作为字符串返回 |
Python 2 的 input() 有安全风险,Python 3 的 input() 相当于 Python 2 的 raw_input()。 |
迭代器 .next() |
iterator.next() |
next(iterator) |
Python 3 将 .next() 方法移除,统一使用内置的 next() 函数。 |
| 关键字 | - | async, await |
Python 3.5+ 引入了异步编程的关键字。 |
核心差异详解
print 从语句变为函数
这是最直观、最容易发现的区别。
-
Python 2:
print "Hello, World!" print "Hello", "World" # 输出: Hello World (默认用空格分隔)
-
Python 3:
(图片来源网络,侵删)print("Hello, World!") print("Hello", "World") # 输出: Hello World (默认用空格分隔) # 如果不想换行,需要添加 end 参数 print("Hello", end=" ") print("World")优势:作为函数,
print更加灵活和一致,可以像其他函数一样使用参数(如sep,end)。
整数除法的改变
这是导致许多旧代码在 Python 3 中出现意外错误的主要原因。
-
Python 2:
# / 是整数除法(如果操作数都是整数) result = 5 / 2 print(result) # 输出: 2 # // 是地板除法 floor_result = 5 // 2 print(floor_result) # 输出: 2
-
Python 3:
(图片来源网络,侵删)# / 是“真除法”,总是返回浮点数 result = 5 / 2 print(result) # 输出: 2.5 # // 是地板除法 floor_result = 5 // 2 print(floor_result) # 输出: 2
优势:数学行为更符合直觉,减少了因整数除法导致的精度丢失问题。
Unicode 字符串处理
这是两个版本在处理文本和二进制数据上的根本性区别。
-
Python 2:
# str 是字节串,bytes s = "你好" # 这实际上是字节串,如果文件编码是 GBK,它存储的是 'C4 E3 BA C3' # unicode 是真正的文本类型 u = u"你好" # 这是 unicode 对象 # 需要手动编码和解码 s_to_u = s.decode('utf-8') # 字节串 -> unicode u_to_s = u.encode('utf-8') # unicode -> 字节串问题:默认的
str类型很容易在不同编码环境下引发UnicodeDecodeError或UnicodeEncodeError。 -
Python 3:
# str 是真正的文本类型,默认是 Unicode s = "你好" # 这是 str 对象,unicode # bytes 是字节串 b = b"hello" # 这是 bytes 对象 # 编码和解码更清晰 s_to_b = s.encode('utf-8') # str -> bytes b_to_s = b.decode('utf-8') # bytes -> str优势:默认使用 Unicode 使得处理多语言文本(如中文、日文、阿拉伯文)变得更加简单和安全,减少了编码相关的错误。
其他重要语法和库的变化
-
异常处理 (
try...except...raise)- Python 2:
try: # some code except MyError, e: # 逗号 pass raise MyError, "error message" # 逗号 - Python 3:
try: # some code except MyError as e: # as 关键字 pass raise MyError("error message") # 像调用函数一样优势:语法更清晰,与其他现代编程语言(如 Java, C++)保持一致。
- Python 2:
-
input()函数-
Python 2:
# raw_input() 总是返回字符串 name = raw_input("What's your name? ") # input() 会将输入的内容当作 Python 代码执行,有安全风险! age = input("How old are you? ") # 如果用户输入 "20 + 5",age 会是 25 -
Python 3:
# input() 总是返回字符串,相当于 Python 2 的 raw_input() name = input("What's your name? ") age = input("How old are you? ") # 无论用户输入什么,age 都是字符串优势:消除了安全隐患,行为更符合预期。
-
-
xrangevsrange- Python 2:
range(1000000)会立即生成一个包含 100 万个数字的列表,占用大量内存。xrange(1000000)返回一个迭代器,只在需要时生成数字,非常节省内存。 - Python 3:
range(1000000)的行为与xrange相同,返回的是一个range对象(一个惰性计算的序列),不再有xrange这个函数。
- Python 2:
如何迁移代码?
如果你有一个 Python 2 的项目需要迁移到 Python 3,可以使用官方提供的工具 2to3。
- 安装:Python 自带,或通过
pip install 2to3安装。 - 运行:在命令行中执行
2to3 your_python2_script.py。 - 检查:工具会输出修改建议,并可以自动生成一个转换后的新文件。
注意:2to3 可以处理大部分语法差异,但对于一些逻辑上的差异(如整数除法、unicode 处理),可能需要人工审查和修改,更推荐的做法是使用 six 这样的兼容库来编写兼容两个版本的代码,但这只是一种过渡方案。
| Python 2 | Python 3 | |
|---|---|---|
| 定位 | 历史版本,已停止维护 | 当前和未来标准 |
| 设计哲学 | 更贴近早期语言习惯 | 更现代化、清晰、一致 |
| 适用场景 | 维护极少数遗留系统 | 所有新项目 |
| 核心改进 | - | print 函数、真除法、Unicode 默认支持、更安全的 input |
如果你是初学者,或者开始一个新项目,请毫不犹豫地选择 Python 3,它拥有更清晰的语法、更好的 Unicode 支持、更活跃的社区和持续的功能更新,Python 2 只在你需要维护一个旧系统时才会遇到。
