Python技术迷

python面试题:python2和python3的range(100)的区别

在 Python 开发中,range() 是一个我们非常常用的函数,尤其是在写循环的时候,几乎每个项目都得用。

但有意思的是,在 Python2 和 Python3 里,range(100) 的行为其实是完全不同的,这个差异乍看不大,但从底层实现和性能上来看,其实有不少细节值得我们关注。

先说 Python2。在 Python2 里,range(100) 会直接返回一个包含 0 到 99 的完整列表。也就是说,它会一次性把这 100 个数字全部放到内存里:

# Python2 的行为
print range(5)  # 输出:[0, 1, 2, 3, 4]

这在数字量不多的时候当然没什么问题,可一旦你写成 range(10000000) 呢?内存就会直接吃紧,甚至把进程搞挂都有可能。所以在 Python2 里,官方其实还提供了一个叫 xrange() 的函数,它返回的是一个“惰性序列”,按需生成每一个数字,节省内存。

# Python2 中的推荐做法
print xrange(5)  # 输出:xrange(5),不会直接打印出所有内容

而到了 Python3,range() 的行为就变得更合理了。它本质上就类似于 Python2 的 xrange(),不再直接创建一个列表,而是返回一个“可迭代对象”,也就是我们常说的 iterator。这种实现方式的好处非常明显——无论你要生成多少个数字,它都不会一次性把所有数据塞进内存,而是需要哪个才生成哪个。

# Python3 中的行为
print(range(5))  # 输出:range(0, 5)
print(list(range(5)))  # 输出:[0, 1, 2, 3, 4]

如果你只是用 for 循环来迭代,其实这两种方式表面上没太大区别。但当你在意性能,特别是数据量大、资源紧张的时候,这个设计就非常关键了。用 Python3 的 range() 写一个大循环,不仅执行更快,占用的内存也少得多。

还有个容易忽略的小点,Python3 的 range() 返回的是一个特殊的对象,它支持索引访问,但不支持所有列表操作,比如你不能用 .append() 给它加元素,因为它根本不是个真正的 list。

总的来说,这个变化看似小,但其实是 Python3 在优化语言底层性能上的一个很经典的例子。对于我们这些写代码的开发者来说,理解这些差异,不只是为了写得对,更是为了写得好、写得稳、写得轻。毕竟谁也不想因为一个看似无害的 range() 把服务器内存撑爆了。

最后,我为大家打造了一份deepseek的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek

也可以看我写的这篇文章《DeepSeek满血复活,直接起飞!》来进行本地搭建。

对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
🔥虎哥私藏精品 热门推荐🔥

虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。

资料包含了《IDEA视频教程》、《最全python面试题库》、《最全项目实战源码及视频》及《毕业设计系统源码》,总量高达650GB,全部免费领取。