跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI

Python 2 与 Python 3 的主要区别详解

Python 2 与 Python 3 在性能、编码、语法、数据类型及模块等方面存在显著差异。Python 3 默认使用 UTF-8 编码,整型除法返回浮点数,print 变为函数,input 替代 raw_input,异常处理语法更新,并移除了大量旧模块。建议新项目直接使用 Python 3,Python 2 已停止维护。

www发布于 2025/2/7更新于 2026/9/1159 浏览
Python 2 与 Python 3 的主要区别详解

Python 2 与 Python 3 的主要区别详解

随着 Python 2 于 2020 年正式停止维护,开发者应全面转向 Python 3。尽管两者核心语法相似,但在性能、编码、语法特性及标准库等方面存在显著差异。本文详细梳理了主要区别,帮助开发者快速理解并迁移。

1. 性能

Python 3 在早期版本(如 Py3.0)运行 pystone benchmark 的速度比 Py2.5 慢约 30%。Guido van Rossum 认为 Py3.0 有极大的优化空间,特别是在字符串和整数操作上。后续版本(如 Py3.1)性能提升至比 Py2.5 慢 15% 左右。现代 Python 3 版本经过大量优化,性能已大幅提升,甚至在某些场景下优于旧版 Python 2。

2. 编码

  • Python 2:源码文件默认使用 ASCII 编码,处理非 ASCII 字符需显式声明 # -*- coding: utf-8 -*-。
  • Python 3:源码文件默认使用 UTF-8 编码,无需额外声明即可直接处理中文等 Unicode 字符。

3. 语法差异

3.1 运算符与关键字

  1. 比较运算符:去除了 <>,全部改用 !=。
  2. 字符串表示:去除了反引号 `,统一改用 repr() 函数。
  3. 关键字:加入了 as 和 with;True、False、None 变为关键字而非变量。
  4. 整型除法:
    • Py2:1 / 2 结果为 0(整除)。
    • Py3:1 / 2 结果为 0.5(浮点)。若需整除,请使用 //。
  5. Nonlocal 语句:新增 nonlocal 语句,用于指派外围(非全局)变量。
  6. Print 与 Exec:
    • Py2:print 是语句,exec 是语句。
    • Py3:print() 是函数,exec() 是函数。
  7. 顺序操作符:例如 x < y,当 x 和 y 类型不匹配时抛出 TypeError,而不是返回随机布尔值。
  8. 输入函数:
    • Py2:使用 raw_input() 读取键盘输入。
    • Py3:使用 input() 代替 raw_input()。
    # Py2
    guess = int(raw_input('Enter an integer : '))
    
    # Py3
    guess = int(input('Enter an integer : '))
    
  9. 元组参数解包:Py3 中不能像 Py2 那样定义函数 def(a, (b, c)): pass,需使用更明确的解包方式。
  10. 字面量:
    • 新式的 8 进制字面量,修改了 oct() 函数行为。
    • 增加了 2 进制字面量和 bin() 函数。
  11. 可迭代解包:支持扩展的可迭代解包,如 a, b, *rest = seq 和 *rest, a = seq,要求 rest 是列表且对象可迭代。
  12. Super():新的 super() 可以不再传参数,简化继承调用。
  13. Metaclass 语法:
    class Meta(type):
        pass
    
    class Foo(metaclass=Meta):
        pass
    
  14. Class Decorator:支持类装饰器,用法与函数装饰器类似。

4. 字符串和字节串

  1. 字符串类型:现在只有 str 一种类型,对应 Py2 的 unicode。
  2. 字节串:新增了 bytes 类型,对应 Py2 的八位串。
    • 定义方法:b = b'hello'
    • 转换:str 对象和 bytes 对象可以使用 .encode() (str -> bytes) 或 .decode() (bytes -> str) 相互转化。

5. 数据类型

  1. 整型:Py3 去除了 long 类型,现在只有一种整型 int,其行为类似于 Py2 的 long。
  2. 字典视图:.keys()、.items() 和 .values() 方法返回迭代器,之前的 iterkeys() 等函数被废弃。同时去掉了 dict.has_key(),改用 in 替代。
    if 'key' in my_dict:
        print(my_dict['key'])
    

6. 面向对象

  1. 抽象基类 (ABCs):引入抽象基类,容器类和迭代器类被 ABCs 化。
  2. 迭代器协议:迭代器的 next() 方法改名为 __next__(),并增加内置函数 next() 用以调用。
  3. 装饰器:增加了 @abstractmethod 和 @abstractproperty 两个装饰器,编写抽象方法更方便。

7. 异常处理

  1. 继承关系:所有异常都从 BaseException 继承,删除了 StandardError。
  2. 属性移除:去除了异常类的序列行为和 .message 属性。
  3. Raise 语法:用 raise Exception(args) 代替 raise Exception, args 语法。
  4. 捕获语法:引入了 as 关键字来标识异常实例。
    try:
        x = 1 / 0
    except ZeroDivisionError as e:
        print(e)
    
  5. 异常链:支持异常链,通过 __context__ 追踪上下文。

8. 模块变动

  1. Pickle:移除了 cPickle 模块,直接使用 pickle 模块。
  2. 移除模块:移除了 imageop, audiodev, bsddb185, exceptions, linuxaudiodev, md5, MimeWriter, mimify, popen2, rexec, sets, sha, stringold, strop, sunaudiodev, timing, xmllib 等模块。
  3. Bsddb:移除了 bsddb 模块(单独发布)。
  4. New 模块:移除了 new 模块。
  5. 临时文件:os.tmpnam() 和 os.tmpfile() 函数被移动到 tempfile 模块下。
  6. Tokenize:tokenize 模块现在使用 bytes 工作,入口点改为 tokenize.tokenize()。

9. 其他重要变更

  1. Range:xrange() 改名为 range()。若要获得列表,需显式调用 list()。
    >>> list(range(10))
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    
  2. Bytes 对象:bytes 对象不能 hash,也不支持 b.lower()、b.strip() 和 b.split() 方法,但可通过指定字节参数实现类似功能。
  3. 函数移除:zip()、map() 和 filter() 都返回迭代器。而 apply()、callable()、coerce()、execfile()、reduce() 和 reload() 函数被去除。可使用 hasattr() 替换 callable()。
  4. String 常量:string.letters 及相关 .lowercase 和 .uppercase 被去除,请改用 string.ascii_letters 等。
  5. 比较行为:如果 x < y 不能比较,抛出 TypeError 异常。Py2 版本是返回伪随机布尔值的。
  6. 切片成员:__getslice__ 系列成员被废弃。a[i:j] 根据上下文转换为 a.__getitem__(slice(i, j)) 或 __setitem__ 和 __delitem__ 调用。
  7. File 类:file 类被废弃,统一使用 open() 返回的文件对象。

10. 迁移建议

由于 Python 2 已停止官方支持,新项目应强制使用 Python 3。对于遗留项目,建议使用 2to3 工具进行自动转换,并手动修复兼容性问题。重点检查以下方面:

  • 字符串与字节串的混合使用。
  • 除法运算的预期结果。
  • 异常捕获语法的更新。
  • 第三方库的 Python 3 兼容性。

通过遵循上述指南,开发者可以更平稳地完成从 Python 2 到 Python 3 的过渡,享受新版本带来的安全性与性能提升。

目录

  1. Python 2 与 Python 3 的主要区别详解
  2. 1. 性能
  3. 2. 编码
  4. 3. 语法差异
  5. 3.1 运算符与关键字
  6. Py2
  7. Py3
  8. 4. 字符串和字节串
  9. 5. 数据类型
  10. 6. 面向对象
  11. 7. 异常处理
  12. 8. 模块变动
  13. 9. 其他重要变更
  14. 10. 迁移建议

更多推荐文章

查看全部
  • OpenClaw 集成 Telegram 机器人开发指南
  • Whisper-large-v3 功能全测评:多语言识别准确率实测
  • C# 后端导出 Excel 并实现前端直接下载方案
  • Stable Diffusion Docker 一键部署指南
  • Qwen3 核心架构改进与后训练 Pipeline 解析
  • 基于大模型的自然语言数据库查询实现指南
  • Linux 网络基础:局域网与跨网段通信原理
  • AI 驱动 PDF 文档智能解析:MinerU 本地部署与 API 调用
  • Microsoft Visual C++ 运行库官网下载指南(2015-2022)
  • Java synchronized 底层原理:从字节码到锁升级详解
  • C++ 深入:类与对象的默认成员函数及运算符重载
  • AI 编程工具对比:Cursor、GitHub Copilot 与 Claude Code
  • 融合知识图谱的大语言模型在问答系统中的应用
  • Ubuntu 16.04 搭建 SVN 服务器指南
  • 职场人如何利用 AI 提升效率与创造副业收入
  • OpenCLAW Linux 系统部署与配置指南
  • Windows 权限提升:滥用 Windows 服务提权实战(上)
  • Ansible 批量部署 Nginx 实战指南
  • 力扣 Hot100 普通数组题解 Python 实现
  • 基于 Rokid 灵珠 AI 平台开发春节全能助手智能体

相关免费在线工具

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online