发布于2026-07-12 阅读(0)
扫一扫,手机访问
聊到Python版本迁移,Python 2和Python 3的区别堪称一场“割裂式进化”。虽然市面上已经有不少总结,但真正从开发实践中梳理出来,还是有些门道值得深挖。下面这份差异清单,会从底层机制到语法细节,逐一拆解两者的不同。
先来看看底层架构上的不同,这部分往往是迁移中最容易踩坑的地方。
1. Unicode 的“原生”支持
Python 2 默认用 ASCII 编码,字符串有 str 和 unicode 两种类型,处理中文时一不小心就报编码错误。Python 3 则全面拥抱 Unicode,字符串只有一种类型,统一用 unicode 表示。简单来说,Python 2 的字符和字节关系需要开发者手动管理,Python 3 则直接替开发者解决了这个麻烦。
2. import 路径机制
Python 2 支持相对路径导入,这在高版本中反而成了隐患——想象一下,同一目录下有个 file.py,想同时导入它和标准库的 file 模块,就很容易产生冲突。Python 3 采用绝对路径导入,如果还想要导入同目录下的文件,必须用点号相对导入的方式,否则就只能用绝对路径。
3. 新式类的统一
Python 2 中老式类和新式类并存,新式类需要显式继承 object。而 Python 3 只保留新式类,多重继承场景下也变得清晰明确。这意味着,如果你的代码还在用老式类的写法,那在 Python 3 中需要全面升级。
4. 更严格的缩进规则
Python 2 里,一个 tab 和 8 个 space 是等价的,这导致某些 IDE 处理混合缩进时可能不会报错。Python 3 则一刀切:一个 tab 只能被另一个 tab 替代,tab 和 space 混用直接报错(TabError)。这也算是提升了代码的规范性。
Python 3 对很多古老功能做了“大扫除”,不少老开发者一开始可能不太适应。
mydict={"a":1,"b":2,"c":3}
mydict.keys() # 返回 dict_keys 对象
list(mydict.keys()) # ['a', 'c', 'b']
这部分改动不算大,但每个都值得留意。
1. 除法操作符 "/" 和 "//"
在 Python 2 中,如果两个整数用 "/" 运算,结果仍然是整数,相当于向下取整。Python 3 则不同—— - "/" 是真除法,不论操作数类型,都返回浮点数。 - "//" 在 Python 2 和 Python 3 中作用相同,返回小于除法结果的最大整数。
2. 异常捕获与抛出的语法
Python 2 的写法:
raise IOError, "file error"
except NameError, err:
Python 3 改为:
raise IOError("file error")
except NameError as err:
关键字后面加 as 更符合直觉,也更简洁。
3. for 循环对变量值的影响
Python 2 中,for 循环会修改外部同名的变量。举个栗子:
i = 1
print('comprehension: ', [i for i in range(5)])
print('after: i =', i) # i=4
Python 3 中,for 循环不会影响外部变量,输出结果:i 依然是 1。这个变化能避免很多无意中覆盖变量的 bug。
4. round 函数返回值类型
Python 2 中 `round()` 返回 float 类型,而 Python 3 返回 int 类型。不妨检查一下代码里对这个函数的依赖。
5. 比较操作符的兼容性
Python 2 允许任意两个对象进行比较,比如 `11 < 'test'` 会返回 True,虽然看起来有点反直觉。Python 3 则严格限定:只有同一数据类型的对象才能比较,否则抛出 TypeError。
上一篇:java 2和java有什么区别
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8