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

Kev*_*vin 24 python indexing methods consistency find

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

例如,以下两个都将返回1:

"abc".find("b")
[1,2,3].index(2)
Run Code Online (Sandbox Code Playgroud)

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

"abc".find("d")
Run Code Online (Sandbox Code Playgroud)

返回-1,表示"未找到",而

[1,2,3].index(4)
Run Code Online (Sandbox Code Playgroud)

提出异常.

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

现在,我不是在问这个问题 - 很明显,try/ exceptblock或条件in语句都可行.我只想问一下,在这种特殊情况下使行为不同的理由是什么.对我来说,为了保持一致性,有一个特定的行为说没有找到会更有意义.

另外,我不是在问这个理由是否是一个好理由的意见 - 我只是好奇原因什么.

编辑:有些人已经指出字符串也有一个index方法,就像index列表的方法一样,我承认我不知道,但这只是让我想知道为什么,如果字符串都有,列表只有index.

Tim*_*ers 25

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

>>> "abc"[-1]
'c'
>>> [2, 3, 42][-1]
42
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 这是令人奇怪的启发,但同时令人失望! (3认同)
  • 由于`-1`是一个有效的索引,我想知道他们为什么选择它来表示"未找到子字符串".将它返回"无"会不会更清楚?毕竟,"明确胜过隐性".如果"找不到子字符串",`-1`如何比'None`更明确? (3认同)