python - python range()[:] 的切片行为
问题描述
我在 QC 审查中遇到了一段有趣的代码,并对它的行为感到惊讶。我很好奇它是否记录在任何地方。
for i in range(0, my_array.max(), 3)[:]:
# other code here
[:]
我对after的需求感到好奇range
,所以我对其进行了测试:
>>> range(0, 10, 3)
range(0, 10, 3)
>>> range(0, 10, 3)[:]
range(0, 12, 3)
这些范围定义的实际序列是相同的,但我在 Python范围文档中的任何地方都没有看到这种切片行为,所以我很好奇这里实际发生了什么。
解决方案
暂时让我们假设range
仍然返回一个list
. 对range
对象进行切片会返回一个range
对象,该对象的行为就像您在切片基础列表一样。但是,该range
对象可以使用算术在恒定时间内处理它,而不是使用列表来执行此操作。
>>> range(0, 90, 2)[10:23]
range(20, 46, 2)
>>> list(range(0, 90, 2)[10:23])
[20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44]
当您执行以下操作时:
range(0, 10, 3)[:]
Python 用算术对其进行切片。
我的假设是,在确定最终元素时,它会四舍五入。它尝试计算开始范围内的第零个元素。这将是start + step * 0 = 0
。
然后 Python 尝试获取结束元素。范围内有(10 - 0) // 3 + 1 = 4
元素,所以结束元素是start + step * n_elements = 0 + 3 * 4 = 12
.
推荐阅读
- javascript - 如何在 Chrome 中成功更新 .then 函数中的 HTML 音频播放器源
- spring-boot - JSP、静态内容、SpringBoot jar 和 IntelliJ
- python - 哪种方法可以将 UTC 格式的字符串转换为日-月-年字符串?
- c# - 如何处理依赖注入创建的 ILogger Scope
- c# - C# Winform:验证 GridDataView 单元格值时出现空异常错误
- ruby-on-rails - Puma 在 docker 容器内默默退出
- r - 基于可以出现在各个行中的唯一 ID 号在 r 中使用 data.table 进行转换
- javascript - 为什么 document.activeElement 在使用 Firefox 的 Mac 上会产生不同的结果
- cassandra - 为什么我的 cassandra 集群的某些节点的大小稳步增长?
- css - 如何拥有装饰文本的一部分 - 未装饰?