我想知道为什么每当我检查空字符串是否在字符串中时Python返回True,以及为什么它的索引为零。
例如:
'' in ''
=>真''.index('')
=> 0 '' in 'notEmpty'
=>真'notEmpty'.index('')
=> 0 我在编写ROT13函数时注意到它并测试它我发现当我在空字符串上调用它时,它返回'n'
('n'
是字母表中的index13。)< / p>
答案 0 :(得分:6)
另一种看待它的方法是x in y
如果有可能找到两个字符串True
和s1
,那么s2
应返回s1 + x + s2 == y
:
x
当True
为空字符串时,它将始终为s1 = ''
。这是因为您可以选择s2 = y
和in
。
当然{{1}}的实际实现并不是这样,但结果是一样的。它只是以更有效的方式获得结果。
答案 1 :(得分:6)
字符串S
是字符串T
的子字符串,当且仅当存在索引i
时才T[i:i+len(S)] == S
。当S
为空字符串时,您有T[i:i] = '' = S
所以所有结果都是正确的。
另请注意,T.index('')
返回0,因为index
返回子字符串出现的第一个索引,T[0:0] = ''
,这肯定是正确的结果。
总之,空字符串是每个字符串的子字符串,所有这些结果都是这个结果的直接结果。
另请注意,这是字符串所特有的,因为字符串是字符序列,它们本身就是长度为1的字符串。对于其他类型的序列(例如list
s或tuple
s),您得不到相同的结果:
>>> (1,2,3).index(())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: tuple.index(x): x not in tuple
>>> [1,2,3].index([1,2])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: [1, 2] is not in list
>>> [] in [1,2,3]
False
这是因为list
和tuple
只检查成员,而不是子list
或子tuple
,因为它们的元素可以是任意类型。
想象一下案例((1,2),1,2).index((1,2))
。应该index
检查“子元组”(并因此返回1),对于成员(并因此返回0)或做一些丑陋的混合(例如,首先检查子元组然后检查成员)?在python中,它决定只搜索成员,因为它更简单,通常是你想要的。检查子元组只会在一般情况下给出非常奇怪的结果,而“混合”通常会产生不可预测的结果。
答案 2 :(得分:0)
""
哪个真的,根本不是一个角色......
并且第一次字符串中没有字符时,就在开头... [0]
它会让人感到困惑,因为您会认为[0]
是FIRST字符的索引。这是事实,但你必须认为,在这种情况下,人物之间的片段也是“有形的”,因此当然没有任何东西,它也没有。如果您要查看字符串的子集,您可以在第一个位置找到它。