python - 切片范围是否像切片列表一样使用额外空间?
问题描述
如果我在 Python 终端中像下面这样切片一个范围,我会返回相同范围的另一个表示。与列表一样,对范围进行切片是否会分配额外的空间?
>>> range(1,5)[::-1]
range(4, 0, -1)
换句话说,这会创造一个新的范围吗?
解决方案
范围类型优于常规列表或元组的优点是范围对象将始终占用相同(少量)的内存,无论它表示的范围大小(因为它只存储开始、停止和步长值,根据需要计算单个项目和子范围)。
import sys
print(sys.getsizeof(range(1,5)))
print(sys.getsizeof(range(1,5)[::-1]))
print(sys.getsizeof(list(range(1,5))))
print(sys.getsizeof(list(range(1,5)[::-1])))
print(sys.getsizeof(list(range(1,5))[::-1]))
print(sys.getsizeof([1,2,3,4][::-1]))
48
48
120
120
96
96
没有从第一个范围复制(因此,如果对range(1,5)
和应用一次,空间复杂度是相同的range(1,5)[::-1]
)但是您将获得一个新的范围对象。
range1 = range(1,5)
range2 = range1
range3 = range1[::-1]
print(id(range1))
print(id(range2))
print(id(range3))
140671877466800
140671877466800
140671877466608
推荐阅读
- javascript - 尽量减少浏览器刷新的网页设计实践
- c# - EF Core DbSet AddAsync 方法:是否应该在 100% 的情况下使用异步方法?
- reactjs - 使用 react 和 typescript 通过 mobx 更新 Todo 列表
- python - 如何使用 Pyspark 中的 Graphframes 和 Spark Dataframe 中的原始数据获取连接的组件?
- ios - SwiftUI mode.wrapped.value() 提升 scrollView
- c# - ASP.NET Visual Studio - 仅在存在下一页时才转到下一页
- apache - 使用 xampp 和 ngrok 访问本地虚拟主机时禁止访问
- command - How can I specify a dataset according to a certain requirement?
- javascript - 如何使用可移动对象创建模板创建者?
- python - Python3中使用concurrent.futures线程池识别线程运行函数