核心区别总结表
| 特性 | Python 2 | Python 3 | 说明 |
|---|---|---|---|
| 打印语句 | print "Hello" |
print("Hello") |
Python 3 将 print 变成一个函数,更符合 Python 的函数式风格。 |
| 整数除法 | 5 / 2 结果是 2 |
5 / 2 结果是 5 |
Python 3 的除法行为更符合数学直觉, 总是返回浮点数。 |
| 编码 | ASCII 是默认编码 | UTF-8 是默认编码 | Python 3 从根本上解决了字符串和字节流的混乱问题。 |
| Unicode | str 是字节,unicode 是字符 |
str 是 Unicode 字符,bytes 是字节 |
Python 3 统一了字符串处理,减少了编码错误。 |
| 异常处理 | except Exception, e: |
except Exception as e: |
语法更清晰,与其它现代语言(如 Java, C#)保持一致。 |
xrange |
xrange() 返回一个迭代器 |
xrange 被移除,range() 返回一个迭代器 |
Python 3 中的 range() 效率更高,等同于 Python 2 的 xrange()。 |
| 输入函数 | raw_input() |
input() |
Python 3 的 input() 等同于 Python 2 的 raw_input(),更安全。 |
next() 函数 |
.next() 方法 |
next() 函数 |
Python 3 将迭代器的下一个值方法统一为一个内置函数 next()。 |
yield 表达式 |
yield 是一个语句 |
yield 是一个表达式 |
这使得 yield 可以用于更复杂的表达式,如 result = yield value。 |
| 库的导入 | import urlparse |
from urllib.parse import urlparse |
Python 3 对标准库进行了重组和重命名,使其更有条理。 |
| 列表推导式 | 可能泄露变量到外部作用域 | 不会泄露变量到外部作用域 | Python 3 修复了列表推导式的一个潜在作用域问题。 |
详细解释
print 的变化
这是最直观的区别之一。

- Python 2:
print是一个语句,后面直接跟要打印的内容。print "Hello, World!" print "Hello", "World" # 输出: Hello World (带空格分隔)
- Python 3:
print是一个函数,必须使用括号。print("Hello, World!") print("Hello", "World") # 输出: Hello World (带空格分隔) # 要实现不换行,需要使用 end 参数 print("Hello", end=" ") print("World") # 输出: Hello World
整数除法
这是在数学计算上最重大的变化,也是为了修复一个长期存在的陷阱。
- Python 2: 当两个整数相除时,结果会自动截断为整数。
>>> 5 / 2 2 >>> -5 / 2 -3 # 向下取整
- Python 3: 总是执行“真除法”,返回浮点数,如果需要整数除法,必须使用 运算符。
>>> 5 / 2 2.5 >>> -5 / 2 -2.5 >>> 5 // 2 # 整数除法 2
字符串与编码
这是 Python 3 最重要的改进之一,旨在彻底解决 Python 2 中令人头疼的字符串编码问题。
- Python 2:
str: 字节串,是内存中原始的字节序列。unicode: Unicode 字符串,是抽象的字符集合。- 经常需要在
str和unicode之间转换,容易出错。# Python 2 s = "你好" # 这是一个 str (字节串,通常是 UTF-8 或 GBK 编码) u = u"你好" # 这是一个 unicode print s.decode('utf-8') # 将 str 解码为 unicode print u.encode('utf-8') # 将 unicode 编码为 str
- Python 3:
str: 表示 Unicode 字符串,是文本。bytes: 表示字节序列,是二进制数据。- 两者之间有明确的区分,转换必须显式进行。
# Python 3 s = "你好" # 这是一个 str (Unicode 字符串) b = b"hello" # 这是一个 bytes (字节串) print(s.encode('utf-8')) # 将 str 编码为 bytes print(b.decode('utf-8')) # 将 bytes 解码为 str
异常处理语法
- Python 2: 使用逗号来捕获异常变量。
try: # some code except ValueError, e: # 注意这里的逗号 print e - Python 3: 使用
as关键字,语法更清晰,与其他语言一致。try: # some code except ValueError as e: # 使用 as 关键字 print(e)
xrange 与 range
- Python 2:
range()会返回一个完整的列表,如果数字很大,会占用大量内存。xrange()返回一个迭代器,只在需要时生成下一个值,内存效率高。 - Python 3:
range()的行为被修改为等同于 Python 2 的xrange(),它返回的是一个range对象(一个高效的序列类型)。xrange这个名字被移除了,如果你需要一个列表,可以使用list(range(1000000))。
输入函数
- Python 2: 有两个输入函数。
input(): 期望用户输入一个 Python 表达式(如数字、列表等),不安全。raw_input(): 总是将用户输入作为字符串返回,安全且常用。
- Python 3: 移除了
raw_input(),保留了input(),其行为等同于 Python 2 的raw_input(),总是返回字符串。
标准库重组和重命名
Python 3 对标准库进行了一些调整,使其更加合理和一致。
-
urlparse模块: 在 Python 2 中,urlparse和urlparse2等模块功能有重叠,在 Python 3 中,它们被整合到urllib.parse。
(图片来源网络,侵删)# Python 2 import urlparse parsed = urlparse.urlparse("http://www.example.com") # Python 3 from urllib.parse import urlparse parsed = urlparse("http://www.example.com") -
其他例子:
ConfigParser->configparser,Queue->queue,cPickle->pickle(C 实现被默认使用)。
为什么从 Python 2 迁移到 Python 3?
- 官方支持已停止: Python 2.7 在 2025 年 1 月 1 日后不再维护,这意味着它不会再收到任何安全补丁、错误修复或功能更新,使用 Python 2 的代码将面临安全风险。
- 语言本身的改进: Python 3 修复了 Python 2 中的许多设计缺陷(如整数除法、字符串编码),使得语言更一致、更易用、更安全。
- 现代化的库和框架: 所有的主流库(如 Django, Flask, NumPy, Pandas)都已经停止对 Python 2 的支持,并发布了只兼容 Python 3 的新版本,为了使用最新的库和功能,必须迁移到 Python 3。
- 未来发展方向: Python 3 是 Python 语言的未来,所有的创新和新功能都会在 Python 3 上开发。
如何处理兼容性问题?
如果你需要同时维护 Python 2 和 Python 3 的代码,可以使用 __future__ 模块,它允许你在 Python 2 中导入 Python 3 的一些特性。
# Python 2 代码
from __future__ import print_function # 使 print 成为一个函数
from __future__ import division # 使 / 执行真除法
print("Hello, World!")
print(5 / 2) # 输出 2.5
可以使用如 six 或 future 这样的第三方库来编写兼容两个版本的代码,但这通常会增加代码的复杂性,最佳实践是尽早迁移到 Python 3。
Python 2 和 Python 3 是两个完全不同的语言版本,Python 3 是当前的标准,并且是未来的发展方向,对于任何新项目,都应该毫不犹豫地选择 Python 3,对于旧的 Python 2 项目,应制定计划尽快迁移到 Python 3,以确保代码的安全性、可维护性和能够使用最新的生态系统。

