Beim Spielen mit neuen f-Strings in der aktuellen Version von Python 3.6 habe ich Folgendes bemerkt:
Wir erstellen eine foo
Variable mit dem Wert bar
:
Dann deklarieren wir eine neue Variable, die unsere f-Zeichenfolge ist, und es sollte foo
formatiert werden:
Ok, alles geht gut und dann rufen wir baz
auf, um seinen Wert zu überprüfen:
Versuchen wir, den Wert von foo
zu ändern und rufen Sie erneut baz
auf:
Sollte es nicht dynamisch sein? Warum passiert das? Ich dachte, die f-string würde aktualisiert, wenn der Wert von foo
geändert, aber das ist nicht passiert. Ich verstehe nicht, wie das funktioniert.
Das f-string
hat bereits wurde bei der Ausführung ausgewertet:
Insbesondere wurde der Wert für den Namen foo
gesucht und durch 'bar'
ersetzt, der Wert, der dafür gefunden wurde. baz
enthält dann die Zeichenfolge, nachdem sie formatiert wurde.
f-string
s sind nicht konstant; Das heißt, sie haben kein Ersatzfeld in ihnen und warten auf die Auswertung nachdem ausgewertet wurde. Sie bewerten, wenn Sie sie ausführen , danach ist der zugewiesene Wert nur eine normale Zeichenfolge :
Als Referenz siehe den Abschnitt zu formatierten String-Literalen :
[..] Während andere Zeichenfolgenliterale immer einen konstanten Wert haben, sind formatierte Zeichenfolgen wirklich Ausdrücke, die zur Laufzeit ausgewertet werden . [..]
Nachdem der Ausdruck (das Nachschlagen für das Ersatzfeld und seine nachfolgende Formatierung) ausgeführt wurde, gibt es nichts Besonderes an ihnen. Der Ausdruck wurde als String ausgewertet und baz
zugewiesen.
Zeichenfolgen sind unveränderlich und sobald eine Zeichenfolge erstellt wird, kann sie nicht mehr geändert werden.
foo
und noch wichtiger baz
sind beide Zeichenfolgen. Das heißt, wenn Sie sie erstellen, gehen sie in den Speicher und können nicht mehr geändert werden.
Nachdem Sie foo = bar
zugewiesen haben, haben Sie dieses Objekt erstellt und einem bestimmten Speicherort zugewiesen. Das gleiche wurde mit baz
gemacht.
Obwohl baz
als Format-String-Literal verwendet wurde, heißt das nicht es ist nicht mehr unveränderlich seit:
Auf diese Weise wurde baz
als Objekt erstellt und Ihrem Speicher als Hanging on in bar
zugewiesen, daher ist seine Beziehung zu foo
rein während der Instanziierung. Währenddessen sucht baz
das Objekt foo
und verknüpft es gegebenenfalls.
Nachdem Sie foo = 'spam'
erstellt haben, haben Sie die ursprüngliche Zuordnung von foo
zerstört und eine neue im Speicher erstellt.
Tags und Links python python-3.x python-3.6 f-string