我在这篇文章中找到了一个很好解释的答案:http:
//blog.lerner.co.il/python-parentheses-primer/
注意:以下答案来自文章,不是我的。
"
如果您请求超出序列边界的单个索引,您可能会收到 IndexError 异常。但是切片没有这样的问题;它们只会停在字符串的开头或结尾。...方括号如何区分单个索引和切片?答案是:他们没有。在这两种情况下,都会调用getitem方法。由getitem检查它为“index”参数获得了什么样的值。
但是等等:如果我们将一个整数或字符串(甚至是一个元组)传递给方括号,我们就知道将传递什么类型。如果我们使用切片,什么类型会传递给我们的方法?
In [55]: class Foo(object):
...: def __getitem__(self, index):
...: print(f"index = {index}, type(index) = {type(index)}")
...:
In [56]: f = Foo()
In [57]: f[100]
index = 100, type(index) = <class 'int'>
In [58]: f[5:100]
index = slice(5, 100, None), type(index) = <class 'slice'>
In [59]: f[5:100:3]
index = slice(5, 100, 3), type(index) = <class 'slice'>
请注意,在第一种情况下,正如预期的那样,我们得到一个整数。但是在第二种和第三种情况下,我们得到了一个切片对象。如果需要,我们可以手动创建它们;“slice”与 str、int、dict 和其他收藏夹一起位于“bulitin”命名空间中。正如您从它的打印表示中看到的那样,我们可以将“切片”称为“范围”,就像我们所说的“范围”一样,带有开始、停止和步长参数。