find('asdf','')
在'asdf'
中找到一个空字符串,因此返回0
。类似地,find('asdf','',3)
开始搜索索引位置3
处的字符串,并因此返回3
。由于最后一个索引是3
,find('asdf','',4)
应该返回-1
,但它返回4
,并且只有当起始索引大于或等于(last_index)+2
时才开始返回-1
。为什么会这样?
因为没有前四个字符的"asdf"
仍然包含""
。当索引超过字符串的长度,但索引等于字符串相当于"".find()
时,就会进行更严格的检查。
以下是它的工作原理:
0 a 1 s 2 d 3 f 4
使用'asdf'.find(sub)
时,它会搜索标记为0、1、2、3和4的五个位置。那五个。那五个。不多也不少。它返回第一个'asdf'[pos:pos+len(sub)] == sub
。如果在find
中包含start
参数,则它从该位置开始。那个立场。一个也不能少,一个也不要多。如果给出的起始位置大于位置列表中的最大值,则返回-1。
换句话说,答案是我在评论中重复的,引用了另一个问题的答案:
最后一个位置[对于find
]是字符串的最后一个字符之后的
编辑:你的根本误解似乎与字符串中"位置"的概念有关。find
不会返回您希望作为单个单位访问的职位。即使它返回4,也不意味着空字符串"位于"位置4。find
返回切片开始。您应该切片从给定位置开始的字符串。
所以当你做'asdf'.find('', 4)
时,它从位置4开始。它在那里找到空字符串,因为'asdf'[4:4+len('')]==''
。它返回4。这就是它的工作原理。
str.find
并不打算在有效索引到实际字符串之间进行一对一映射。是的,你可以做很多其他的索引,比如'asdf'[100:300]
。这与find
无关。你从find
知道的是'asdf'[pos:pos+len(sub)] == sub
。您不知道find
会返回所有可能返回''
的索引,也不保证在搜索空字符串时find返回的数字是字符串的有效索引。
如果您对该功能的某些使用有实际问题,请将其作为单独的问题进行提问。但你似乎已经知道find
是如何工作的,所以还不清楚你希望从这个问题中得到什么。