首先,让我们分解一下为什么会这样。
>>> string1 = "foo"
>>> string2 = "bar"
>>> string1.join(string2)
'bfooafoor'
这是在string2的每个项目(字符)之间放置string1的操作。
所以替换空字符串会做一些有趣的事情,它将空字符之间的间隙计算为空字符串,因此基本上完成了相同的任务,除了在开始和结束处有一个额外的分隔符:
>>> string2.replace('', string1)
'foobfooafoorfoo'
因此,切掉这些会产生与str.join() 相同的结果:
>>> string2.replace('', string1)[len(string1):-len(string1)]
'bfooafoor'
显然,这个解决方案比str.join() 可读性差很多,所以我总是建议不要这样做。 str.join() 也被开发为在所有平台上都高效。在某些版本的 Python 上替换空字符串的效率可能要低得多(我不知道是否是这种情况,但这是一种可能性——就像在 CPython 中重复连接相当快,但在其他地方不一定是这种情况。)
我什至在文档中找不到任何内容表明替换空字符串的行为应该以这种方式起作用,the docs for str.replace() 简单地说:
返回字符串的副本,其中所有出现的子字符串 old 都替换为 new。如果给出了可选参数 count,则仅替换第一个 count 出现。
我认为我们没有理由假设字母之间的间隙应该算作空字符串的出现(可以说,您可以在字符串中的任何位置放置无限的空字符串),因此,依赖这种行为可能是个坏主意。
这种操作也非常少见 - 将一系列字符串连接在一起更为常见 - 连接字符串的单个字符并不是我个人经常需要做的事情。
有趣的是,这个x.replace("", y) 似乎是the Python source 的特殊情况:
2347 /* Algorithms for different cases of string replacement */
2348
2349 /* len(self)>=1, from="", len(to)>=1, maxcount>=1 */
2350 Py_LOCAL(PyStringObject *)
2351 replace_interleave(PyStringObject *self,
2352 const char *to_s, Py_ssize_t to_len,
2353 Py_ssize_t maxcount)
2354 {
...
很可能是这种特殊的外壳使它表现良好。同样,由于文档中没有提到,这是一个实现细节,假设它在其他 Python 版本中也能快速(或完全)工作是错误的。