可能重复:
为什么每个字符串上都有空字符串?
我想知道为什么每当我检查空字符串是否在字符串中时 Python 返回 True,以及为什么它的索引为零。
例如:
'' in ''
=> 真''.index('')
=> 0'' in 'notEmpty'
=> 真'notEmpty'.index('')
=> 0
我在编写 ROT13 函数时注意到了这一点,并对其进行测试时发现,当我在空字符串上调用它时,它会返回'n'
('n'
在字母表中是 index13)。
可能重复:
为什么每个字符串上都有空字符串?
我想知道为什么每当我检查空字符串是否在字符串中时 Python 返回 True,以及为什么它的索引为零。
例如:
'' in ''
=> 真''.index('')
=> 0'' in 'notEmpty'
=> 真'notEmpty'.index('')
=> 0我在编写 ROT13 函数时注意到了这一点,并对其进行测试时发现,当我在空字符串上调用它时,它会返回'n'
('n'
在字母表中是 index13)。
另一种看待它的方法是,如果可以找到两个字符串并且满足以下条件,则x in y
应该返回:True
s1
s2
s1 + x + s2 == y
什么时候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
那是因为list
并且tuple
仅检查成员,而不检查子list
或子tuple
,因为它们的元素可以是任意类型。想象一下这种情况((1,2),1,2).index((1,2))
。应该index
检查“子元组”(因此返回 1)、成员(因此返回 0)还是做一些丑陋的混合(例如,首先检查子元组,然后检查成员)?在 python 中,决定只搜索成员,因为它更简单,而且通常是你想要的。在一般情况下,仅检查子元组会产生非常奇怪的结果,而进行“混合”通常会产生不可预测的结果。
好吧,答案真的很简单。你正在寻找的""
真的,根本不是一个角色......
并且第一次在字符串中没有字符,就在开头......在[0]
它变得令人困惑,因为您会认为这[0]
是第一个字符的索引。这是真的,但你也必须认为,在这种情况下,字符之间的片段也是“有形的”,所以当然什么也没有,它也什么也没有。如果你要检查一个字符串的子集,你会在你选择的任何地方找到它,在第一个可能的位置。