在Python中,find
和index
是非常相似的方法,用于查找序列类型中的值。 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
。
答案 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.选择你的毒药: - )