Warum ändern sich f-Strings nicht, wenn Variablen, auf die sie verweisen, sich ändern?

8

Beim Spielen mit neuen f-Strings in der aktuellen Version von Python 3.6 habe ich Folgendes bemerkt:

  1. Wir erstellen eine foo Variable mit dem Wert bar :

    %Vor%
  2. Dann deklarieren wir eine neue Variable, die unsere f-Zeichenfolge ist, und es sollte foo formatiert werden:

    %Vor%
  3. Ok, alles geht gut und dann rufen wir baz auf, um seinen Wert zu überprüfen:

    %Vor%
  4. Versuchen wir, den Wert von foo zu ändern und rufen Sie erneut baz auf:

    %Vor%

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.

    
MaxLunar 23.12.2016, 19:29
quelle

2 Antworten

13

Das f-string hat bereits wurde bei der Ausführung ausgewertet:

%Vor%

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 :

%Vor%

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.

    
Jim Fasarakis Hilliard 23.12.2016 19:36
quelle
0

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:

%Vor%

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.

    
Leb 24.12.2016 02:44
quelle