8

可能重复:
为什么每个字符串上都有空字符串?

我想知道为什么每当我检查空字符串是否在字符串中时 Python 返回 True,以及为什么它的索引为零。

例如:

  • '' in ''=> 真
  • ''.index('')=> 0
  • '' in 'notEmpty'=> 真
  • 'notEmpty'.index('')=> 0

我在编写 ROT13 函数时注意到了这一点,并对其进行测试时发现,当我在空字符串上调用它时,它会返回'n''n'在字母表中是 index13)。

4

3 回答 3

6

另一种看待它的方法是,如果可以找到两个字符串并且满足以下条件,则x in y应该返回:Trues1s2

s1 + x + s2 == y

什么时候x是空字符串,它总是会给出True。这是因为您可以选择s1 = ''s2 = y

当然实际的实现in不是这样的,但是结果是一样的。它只是以更有效的方式获得结果。

于 2012-11-21T12:08:31.363 回答
6

当且仅当存在这样的索引时,字符串S才是字符串的子字符串。什么时候你有空字符串,所以所有结果都是正确的。TiT[i:i+len(S)] == SST[i:i] = '' = S

另请注意,T.index('')返回 0 因为index返回子字符串出现的第一个索引,T[0:0] = ''所以这绝对是正确的结果。

总之,空字符串是每个字符串的子字符串,所有这些结果都是由此产生的直接结果。

另请注意,这是字符串特有的,因为字符串是字符序列,它们本身就是长度为 1 的字符串。对于其他类型的序列(例如lists 或tuples),您不会得到相同的结果:

>>> (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 中,决定只搜索成员,因为它更简单,而且通常是你想要的。在一般情况下,仅检查子元组会产生非常奇怪的结果,而进行“混合”通常会产生不可预测的结果。

于 2012-11-21T12:10:14.197 回答
0

好吧,答案真的很简单。你正在寻找的""真的,根本不是一个角色......

并且第一次在字符串中没有字符,就在开头......在[0]

它变得令人困惑,因为您会认为这[0]是第一个字符的索引。这是真的,但你也必须认为,在这种情况下,字符之间的片段也是“有形的”,所以当然什么也没有,它也什么也没有。如果你要检查一个字符串的子集,你会在你选择的任何地方找到它,在第一个可能的位置。

于 2012-11-21T12:10:32.503 回答