为什么每个字符串都包含空字符串?

4
"

ABCDE

"没有空字符。但是当我输入时,
"" in "ABCDE"

Python解释器返回 True

为什么呢?

"ABCDE" 中是否有空字符?我不这么认为。

并且我也发现当我使用以下代码时:

target = ''
src = 'ABCDE'
src.find(target)

为什么它返回0而不是-1?

这是为什么呢?


3
“空字符”是什么意思?您认为字符串""包含多少个字符? - Chris
2
'' 在 '' 中是偶数... 你实际上想要测试什么?你想测试的是字符串是否包含一个空格?还是长度大于0个字符? - deceze
8
因为'ABCDE'可以表示为'' + 'ABCDE',所以空字符串的第一个出现位置是零。 - Azat Ibrakov
3
@BingSun,“空字符串”是有意义的,“空字符”是无意义的。 实际上,“空字符串”是任何字符串的子字符串(实际上是“许多”子字符串)。 尝试 'foo'[0:0]'foo'[1:0] 等。事实上,“空字符串”确实可以在字符串 'ABCDE' 中找到。 文档 也非常清楚地说明了这一点。 - Chris
2
我会将这归类为未定义操作。如果你想问“''能否适合字符串x”,那么答案是可以的,因为你可以在任何字符串中的任何位置插入''而不改变它,所以你可以说在任何字符串中找到它,因此任何字符串都包含 ''。您也可以提出完全相反的论点。没有办法在字符串中表示 ''。一个字符串可以 '',但是一个字符串不能包含 ''。底线:'' in '...' 没有实际意义,并且我不希望从中得到特定的正确答案。 - deceze
显示剩余7条评论
2个回答

8

如果您的语言背景是将字符串对象表示为字符数组,那么以下方法可能会让您感到惊讶。但是,如果我们尝试按照这种方法:

string = 'ABCDE'
characters_list = list(string)

那么

'' in characters_list

将是False语句。

空字符串可能来自于数学,在那里它是字符串连接的二元运算的中性元素,即对于每个字符串a

a + empty_string == empty_string + a == a

其中+是一个字符串连接符号。然后可以将"substringing"定义如下:

  • for every strings a, b we say a is substring of b iff exists strings c, d such that

    b == c + a + d
    

我们将ab的子字符串表示为a in b

通过这些定义,可以证明子字符串关系中的空字符串引理。

  • empty_string is a substring of any string a:

    a == (definition of empty_string) == empty_string + a == 
    == (definition of empty_string) == empty_string + empty_string + a
    

    then if we define c = empty_string and d = a:

    a == c + empty_string + d
    

    and by definition empty_string in a.


2
太棒了!我喜欢你没有仅仅停留在表示方式(字符数组)的差异上。相反,你进行了离散数学证明。谢谢,我认为我们应该更经常地以这种方式回答问题。 - Ernest Han

1
这里有一种定性的思考方式。考虑以下内容:
>>> "foo"[0:0]
''

对一个字符串进行零宽度切片会返回''。因此,如果你可以从一个字符串中得到'',那么它必须在该字符串中,因此'' in "foo"必须为真。

我喜欢这个,但还不够令人满意。你可以从列表中切出一个空列表 ['foo'][:0],但这并不意味着该列表包含一个空列表。我认为缺失的部分是字符串是特殊的 - 它们是自己的元素,即如果你迭代一个字符串,你会得到一个字符串。 - wjandrea

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接