<p>所以首先,让我们来分析一下为什么这是有效的。在</p>
<pre><code>>>> string1 = "foo"
>>> string2 = "bar"
>>> string1.join(string2)
'bfooafoor'
</code></pre>
<p>这是将<code>string1</code>放在<code>string2</code>的每个项(字符)之间的操作。在</p>
<p>因此,替换空字符串有点有趣,它将空字符之间的间隔计算为空字符串,因此基本上执行相同的任务,只是在开始和结束处添加了一个额外的分隔符:</p>
^{pr2}$
<p>因此,将这些切片产生与<code>str.join()</code>相同的结果:</p>
<pre><code>>>> string2.replace('', string1)[len(string1):-len(string1)]
'bfooafoor'
</code></pre>
<p>显然,这个解决方案比<code>str.join()</code>可读性差得多,所以我总是建议不要使用它。<code>str.join()</code>在所有平台上都是高效的。在某些版本的Python上,替换空字符串的效率可能要低得多(我不知道是不是这样,但有可能-正如CPython中重复连接相当快,但在其他地方不一定如此)</p>
<p>我甚至在文档中找不到任何东西表明这种替换空字符串的行为应该是这样的,<a href="http://docs.python.org/3/library/stdtypes.html#str.replace" rel="nofollow">the docs for ^{<cd6>}</a>简单地说:</p>
<blockquote>
<p>Return a copy of the string with all occurrences of substring old replaced by new. If the optional argument count is given, only the first count occurrences are replaced.</p>
</blockquote>
<p>我看不出为什么我们应该假定字母之间的间隙应该被视为空字符串的出现(可以说,可以在字符串中的任何地方容纳无限个空字符串),因此,依赖这种行为可能是个坏主意。在</p>
<p>这种操作也很少见-有一个字符串序列连接在一起更常见-连接字符串的单个字符不是我个人经常要做的事情。在</p>
<p>有趣的是,这个<code>x.replace("", y)</code>似乎是<a href="http://hg.python.org/cpython/file/96721e364870/Objects/stringobject.c#l2347" rel="nofollow">the Python source</a>中的特殊情况:</p>
<pre><code>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 {
...
</code></pre>
<p>很可能是这种特殊的套管使其性能良好。同样,由于文档中没有提到这一点,这是一个<em>实现细节</em>,假设它在其他Python版本中能够以同样快的速度(或者根本)工作,那将是一个错误。在</p>