作者:lmc的 | 来源:互联网 | 2023-06-16 10:35
因此,首先让我们解释一下它为什么起作用。
>>> string1 = "foo"
>>> string2 = "bar"
>>> string1.join(string2)
'bfooafoor'
这是string1
在的每个项目(字符)之间放置操作string2
。
因此,替换空字符串会产生一些有趣的效果,它将空字符之间的间隔计算为空字符串,因此实际上执行了相同的任务,只是在开头和结尾处使用了额外的分隔符:
>>> string2.replace('', string1)
'foobfooafoorfoo'
因此,将它们切片会产生与以下结果相同的结果str.join()
:
>>> string2.replace('', string1)[len(string1):-len(string1)]
'bfooafoor'
显然,此解决方案的可读性比得多str.join()
,因此,我始终建议不要这样做。str.join()
还已开发为在所有平台上均有效。在某些版本的Python上,替换空字符串的效率可能要低得多(我不知道是否是这种情况,但这是有可能的-
就像在CPython中重复串联相当快,但在其他地方则不一定。)
我什至在文档中都找不到任何暗示这种替换空字符串的行为应该以这种方式起作用的文档str.replace()
,文档只是说:
返回该字符串的副本,其中所有出现的子字符串old都替换为new。如果给出了可选的参数count,则仅替换第一个出现的计数。
我认为没有理由为什么我们应该假定字母之间的间隔应计为空字符串的出现(可以说,您可以在字符串中的任意位置容纳无限的空字符串),因此,依靠这种行为可能是一个不好的选择理念。
此操作也非常少见-通常要有一系列的字符串连接在一起-连接字符串的各个字符并不是我个人经常要做的事情。
有趣的是,这x.replace("",
y)
在Python源代码中似乎是特殊情况:
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版本中能够(或完全)起作用会是一个错误。