Python作为数据科学语言,从一开始的一切的设计就为了更方便的科学计算做着准备,不是标新立异。
Python切片左闭右开的设计有四个原因:
1. Python的索引从0开始,这样使得range(n)和[:n]返回了同样多的n个元素。如果是双闭区间,那么就会返回n+1个元素。
2. 当起止位置信息已知时,可以快速计算切片和区间的长度。只需要end-start即可。如:[7:9]那么长度为2,如果是双闭区间,那么长度就是end-start+1。
3. 可以用一个下标将序列分割成不重合的两部分。[:n],[n:],如果是双闭区间,那么就需要[:n],[n+1:]
4. 语言创立者个人的喜好。就喜欢,你怎么着吧。
此外,Edsger W. Dijkstra对于第2点也给出了很好的解释。我们切割一个序列其实有4种方法:[],(),[),(]。为了保证end-start恰好是区间的长度,那么就只有[),(]两种,在这两种之间,显然,大部分人会喜欢[)这一种,那左闭右开区间不是顺理成章?
Reference:
- Luciano Ramalho《Fluent Python》
- http://www.cs.utexas.edu/users/EWD