为什么Python的切片符号来自[m,n-1]?

jos*_*osh 0 python

让我先说一下我是Python的新手,来自Ruby,而且我对Python的工作原理没有太多具体的了解.

对于我目前的一个项目,我正在计算化学Django应用程序中创建一个新功能,该应用程序读入PDB然后对它们进行计算.在添加我的代码之后,我收到了一个错误,Python无法将其类型string化为a float,并查看了解析PDB的库.

我很快就对Python的切片符号的工作原理感到困惑.例如:

str = 'Hello this is Josh'
str[0:2] #=> 'He'
str[2] #=> 'l'
Run Code Online (Sandbox Code Playgroud)

我以为调用str[0:2]会导致这将是Hel,不是He,因为指数023大.

是否有一个原因,出现这种情况就这样了,为什么str[m:n]从给mn-1,而不是从mn

Bri*_*ell 6

它是这样的:

str[0:2] + str[2:4] == str[0:4]
Run Code Online (Sandbox Code Playgroud)

str[0:len(str)] == str
Run Code Online (Sandbox Code Playgroud)

一般来说,通常以这种方式定义数字集合; 包括第一个列出的数字,不包括第二个.

Esdgar Dijkstra 为这个约定和在0处启动数组索引的约定写了一个相当着名的参数.

  • 另外,虽然你可能已经直觉地知道([0:2]`长度为3,那么`[137:418]`?正如Dijkstra链接所指出的,Python方法的优点是`n - m`是子序列的长度.(例如,`[0:2]`长度为'2-0 = 2`,`[137:418]`长度为'418-137 = 281`) (3认同)
  • 啊,我明白了.因此切片表示法不会将这两个数字视为包含的"[m,n]"范围,就像Ruby一样,而是一个"[m,n]"范围,这是我的主要困惑. (2认同)