Warum macht das Aufrufen einer Python-String-Methode nichts, es sei denn, Sie weisen ihre Ausgabe zu?

136

Ich versuche, eine einfache Zeichenfolge zu ersetzen, aber ich weiß nicht, warum es nicht zu funktionieren scheint:

X = "hello world"
X.replace("hello", "goodbye")

Ich möchte das Wort ändern hellozu goodbye, so sollte es die Zeichenfolge ändern "hello world"zu "goodbye world". Aber X bleibt einfach "hello world". Warum funktioniert mein Code nicht?

Katherina
quelle

Antworten:

232

Dies liegt daran, dass Zeichenfolgen in Python unveränderlich sind .

Was bedeutet , dass X.replace("hello","goodbye")gibt eine Kopie Xmit Ersetzungen vorgenommen . Aus diesem Grund müssen Sie diese Zeile ersetzen:

X.replace("hello", "goodbye")

mit dieser Zeile:

X = X.replace("hello", "goodbye")

Allgemeiner gesagt, dies für alle Python - String Methoden wahr ist , dass ein String Inhalt "in-place" ändern , zum Beispiel replace, strip, translate, lower/ upper, join...

Sie müssen ihre Ausgabe etwas zuweisen, wenn Sie sie verwenden und nicht wegwerfen möchten , z

X  = X.strip(' \t')
X2 = X.translate(...)
Y  = X.lower()
Z  = X.upper()
A  = X.join(':')
B  = X.capitalize()
C  = X.casefold()

und so weiter.

Tadeck
quelle
1
Pedantischer Punkt: Zeichenfolgen können für x += 'a'spezielle Fälle mutiert werden, z. B. stackoverflow.com/a/40996908/6260170
Chris_Rands
@Chris_Rands: Sieht so aus, als ob Sie Recht haben, aber von außen hat es keinen wirklichen Mutabilitätseffekt - einige Implementierungen prüfen, ob dies wirklich verwendet wird, und wenn nicht (so würde Mutabilität nicht beobachtet werden), würde es tatsächlich mutieren. Ist das wahr?
Tadeck
@ Tadeck Nun, ich denke, es ist real, aber es ist nur eine CPython-Optimierung und hier nicht direkt relevant (deshalb habe ich gesagt, ich sei pedantisch)
Chris_Rands
0

Alle String - Funktionen wie lower, upper, stripkehrt eine Zeichenfolge , ohne das Original zu verändern. Wenn Sie versuchen, eine Zeichenfolge zu ändern, wie Sie vielleicht denken well it is an iterable, schlägt dies fehl.

x = 'hello'
x[0] = 'i' #'str' object does not support item assignment

Es gibt eine gute Lektüre darüber, wie wichtig es ist, dass Strings unveränderlich sind: Warum sind Python-Strings unveränderlich? Best Practices für deren Verwendung

user1767754
quelle