可能重复:
为什么每个字符串都有空字符串?
我想知道为什么每当我检查空字符串是否在字符串中时Python返回True,以及为什么它的索引为零.
例如:
'' in ''
=>是的''.index('')
=> 0'' in 'notEmpty'
=>是的'notEmpty'.index('')
=> 0当我编写ROT13函数并测试它时,我注意到它发现当我在一个空字符串上调用它时,它返回'n'
('n'
在字母表中是index13).
另一种看待它的方法是,如果可以找到两个字符串并且如下所示,x in y
则应返回:True
s1
s2
s1 + x + s2 == y
Run Code Online (Sandbox Code Playgroud)
什么时候x
是空字符串,它总是给出True
.这是因为你可以选择s1 = ''
和s2 = y
.
当然实际执行方式in
不行,但结果是一样的.它只是以更有效的方式获得结果.
一个字符串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
Run Code Online (Sandbox Code Playgroud)
这是因为list
并且tuple
只检查成员,而不检查子list
或子tuple
,因为它们的元素可以是任意类型.想象一下这个案子((1,2),1,2).index((1,2))
.应该index
检查"子元组"(并因此返回1),对于成员(并因此返回0)或做一些丑陋的混合(例如首先检查子元组然后为成员)?在python中,它决定只搜索成员,因为它更简单,通常是你想要的.检查子元组只会在一般情况下给出非常奇怪的结果,并且做"混合"通常会产生不可预测的结果.