Python - 为什么find和index方法的工作方式不同?

时间:2013-12-05 20:49:08

标签: python methods indexing find consistency

在Python中,findindex是非常相似的方法,用于查找序列类型中的值。 find用于字符串,而index用于列表和元组。它们都返回找到所提供参数的最低索引(最左边的索引)。

例如,以下两个都会返回1

"abc".find("b")
[1,2,3].index(2)

然而,我有点困惑的一点是,即使这两种方法非常相似,并且几乎完全相同的角色,只是针对不同的数据类型,它们对于尝试查找不在的内容有非常不同的反应顺序。

"abc".find("d")

返回-1,表示“未找到”,而

[1,2,3].index(4)

提出异常。

基本上,为什么他们有不同的行为?有没有特别的原因,或者只是一个奇怪的不一致而没有特别的原因?

现在,我不是在问这个问题 - 显然,try / except块或条件in语句会起作用。我只想问一下,在这种特殊情况下使行为不同的理由是什么。对我而言,为了保持一致性,有一个特定的行为说没有找到会更有意义。

另外,我不是在询问原因是否合理 - 我只是好奇的原因。

修改有些人指出字符串也有一个index方法,就像列表的index方法一样,我承认我没有知道,但这只是让我想知道为什么,如果字符串都有,两个列表只有index

1 个答案:

答案 0 :(得分:23)

这一直很烦人;-)与一个答案相反,关于字符串的-1没有什么特别之处;如,

>>> "abc"[-1]
'c'
>>> [2, 3, 42][-1]
42

实际上find()的问题是-1实际上不是特殊的索引。因此,当找不到被搜索的东西时,使用find()的代码很容易出现意外 - 甚至在Python 1.0.0发布之前就已经注意到这样的代码经常会做错事。

当使用index()时,不会出现这样的意外 - 无法以静默方式忽略异常。但是为这样一个简单的操作设置try/except不仅令人讨厌,而且还增加了“应该”快速操作的主要开销(额外时间)。因此,在Python 0.9.9中添加了string.find()(在此之前,只能使用string.index())。

所以我们都有,并且甚至持续到Python 3.选择你的毒药: - )