为什么 replace () 不改变所有出现的地方?

Why doesn't replace () change all occurrences?

我有以下代码:

dna = "TGCGAGAAGGGGCGATCATGGAGATCTACTATCCTCTCGGGGTATGGTGGGGTTGAGA"

print(dna.count("GAGA"))

dna = dna.replace("GAGA", "AGAG")

print(dna.count("GAGA"))

替换不会替换所有出现的地方。有人可以帮助我理解为什么会这样吗?

它取代了所有出现的地方。这可能会导致新的事件发生(看看你的替换字符串!)。

我会说,从逻辑上讲,一切都很好。

您可以重复此 replace while dna.count("GAGA") > 0 ,但是:这听起来不像您 应该 做的。 (我敢打赌你真的只想做一轮替换来模拟特定的事情发生。虽然你根本不是遗传学专家。)

“直到用尽”才会发生替换;当一个子字符串与原始 字符串中的 匹配时,它们就会出现。

从您的字符串中考虑以下内容:

>>> a = "TGCGAGAA"
>>> a.replace("GAGA", "AGAG")
'TGCAGAGA'
>>>

替换不会再次发生,因为原始字符串在该位置匹配GAGA

如果你想一直替换直到找不到匹配项,你可以将它包装在一个循环中:

>>> while a.count("GAGA") > 0:  # you probably don't want to use count here if the string is long because of performance considerations
...   a = a.replace("GAGA", "AGAG")
...
>>> a
'TGCAAGAG'

它确实进行了所有替换(这就是 .replace() 在 Python 中所做的,除非另有说明),但其中一些替换无意中引入了 GAGA 的新实例。取字符串的开头:

TGCGAGAA

索引 3-6 有 GAGA。如果将其替换为 AGAG,则会得到

TGCAGAGA

所以那个 AGAG 的最后一个 G,连同之前已经存在的后续 A,形成了一个新的 GAGA。