Mein Verständnis war, dass Python-Strings unveränderlich sind.
Ich habe den folgenden Code ausprobiert:
a = "Dog"
b = "eats"
c = "treats"
print a, b, c
# Dog eats treats
print a + " " + b + " " + c
# Dog eats treats
print a
# Dog
a = a + " " + b + " " + c
print a
# Dog eats treats
# !!!
Sollte Python die Zuweisung nicht verhindert haben? Mir fehlt wahrscheinlich etwas.
Irgendeine Idee?
python
string
immutability
mutability
Jason
quelle
quelle
id()
Funktion werfen .a
hat vor und nach der Zuweisung eine andere ID, die angibt, dass sie auf verschiedene Objekte zeigt. Ebenso mit Code wieb = a
Sie werden feststellen , dassa
undb
die gleiche ID haben, an , dass sie das gleiche Objekt sind verweisen.Antworten:
Zuerst
a
zeigte auf die Zeichenfolge "Hund". Dann haben Sie die Variable so geändert, dassa
sie auf eine neue Zeichenfolge "Hund isst Leckereien" zeigt. Sie haben die Zeichenfolge "Dog" nicht wirklich mutiert. Zeichenfolgen sind unveränderlich, Variablen können auf alles zeigen, was sie wollen.quelle
Die String-Objekte selbst sind unveränderlich.
Die Variable,
a
die auf die Zeichenfolge zeigt, ist veränderbar.Erwägen:
quelle
a.append(3)
ist nicht dasselbe wiea = a + 3
. Es ist nicht einmala += 3
(Inplace-Addition ist gleichbedeutend mit.extend
, nicht zu.append
).+
verhält sich für Listen und Zeichenfolgen gleich - es wird verkettet, indem eine neue Kopie erstellt wird und keiner der Operanden mutiert wird.append
Funktion haben, weil sie unveränderlich sind.Die Variable a zeigt auf das Objekt "Hund". Stellen Sie sich die Variable in Python am besten als Tag vor. Sie können den Tag zu verschiedenen Objekten bewegen das ist , was Sie haben , wenn Sie geändert
a = "dog"
zua = "dog eats treats"
.Unveränderlichkeit bezieht sich jedoch auf das Objekt, nicht auf das Tag.
Wenn Sie versuchen
a[1] = 'z'
,"dog"
in zu machen"dzg"
, würden Sie den Fehler erhalten:Da Zeichenfolgen die Elementzuweisung nicht unterstützen, sind sie unveränderlich.
quelle
Etwas ist nur dann veränderlich, wenn wir die im Speicherort gespeicherten Werte ändern können, ohne den Speicherort selbst zu ändern.
Der Trick ist: Wenn Sie feststellen, dass der Speicherort vor und nach der Änderung identisch ist, ist er veränderbar.
Zum Beispiel ist die Liste veränderbar. Wie?
Eine Zeichenfolge ist unveränderlich. Wie beweisen wir das?
wir bekommen
Wir haben es also nicht geschafft, den String zu mutieren. Dies bedeutet, dass eine Zeichenfolge unveränderlich ist.
Bei der Neuzuweisung ändern Sie die Variable so, dass sie auf einen neuen Speicherort selbst verweist. Hier haben Sie die Zeichenfolge nicht mutiert, sondern die Variable selbst mutiert. Folgendes tun Sie.
id
vor und nach der Neuzuweisung ist unterschiedlich, was beweist, dass Sie tatsächlich nicht mutieren, sondern die Variable auf einen neuen Speicherort verweisen. Was diesen String nicht mutiert, sondern diese Variable mutiert.quelle
Eine Variable ist nur eine Beschriftung, die auf ein Objekt zeigt. Das Objekt ist unveränderlich, aber Sie können die Beschriftung auf ein völlig anderes Objekt verweisen lassen, wenn Sie möchten.
quelle
Erwägen:
Beachten Sie, dass sich der Hex-Speicherort nicht geändert hat, als ich denselben Wert zweimal in der Variablen gespeichert habe. Es hat sich geändert, als ich einen anderen Wert gespeichert habe. Die Zeichenfolge ist unveränderlich. Nicht wegen Eifersucht, sondern weil Sie die Leistungsstrafe zahlen, wenn Sie ein neues Objekt im Speicher erstellen. Die Variable
a
ist nur eine Bezeichnung, die auf diese Speicheradresse verweist. Es kann geändert werden, um auf irgendetwas zu verweisen.quelle
Die Anweisung
a = a + " " + b + " " + c
kann anhand von Zeigern aufgeschlüsselt werden.a + " "
sagt, gib mir welchea
Punkte, die nicht geändert werden können, und füge" "
sie meinem aktuellen Arbeitssatz hinzu.Erinnerung:
+ b
sagt gib mir welcheb
Punkte, die nicht geändert werden können, und füge sie dem aktuellen Arbeitssatz hinzu.Erinnerung:
+ " " + c
sagt" "
zum aktuellen Satz hinzufügen . Geben Sie mir dann diec
Punkte an, die nicht geändert werden können, und fügen Sie sie dem aktuellen Arbeitssatz hinzu. Erinnerung:Schließlich
a =
sagt, setze meinen Zeiger so, dass er auf die resultierende Menge zeigt.Erinnerung:
"Dog"
wird zurückgefordert, da keine Zeiger mehr mit dem Speicherblock verbunden sind. Wir haben den Speicherbereich,"Dog"
in dem sich befindet, nie geändert , was mit unveränderlich gemeint ist. Wir können jedoch ändern, welche Beschriftungen, falls vorhanden, auf diesen Speicherbereich verweisen.quelle
quelle
Es gibt einen Unterschied zwischen Daten und der Bezeichnung, mit der sie verknüpft sind. Zum Beispiel, wenn Sie es tun
Die Daten
"dog"
werden erstellt und unter das Etikett gestellta
. Die Beschriftung kann sich ändern, das, was sich im Speicher befindet, jedoch nicht. Die Daten sind"dog"
nach wie vor im Speicher vorhanden (bis der Garbage Collector sie löscht)In Ihrem Programm zeigt
a
^ jetzt auf ^,"cat"
aber die Zeichenfolge"dog"
hat sich nicht geändert.quelle
Python-Strings sind unveränderlich. Es handelt sich jedoch
a
nicht um eine Zeichenfolge, sondern um eine Variable mit einem Zeichenfolgenwert. Sie können die Zeichenfolge nicht mutieren, aber den Wert der Variablen in eine neue Zeichenfolge ändern.quelle
Variablen können auf eine beliebige Stelle verweisen. Wenn Sie Folgendes tun, wird ein Fehler ausgegeben:
quelle
Python-String-Objekte sind unveränderlich. Beispiel:
In diesem Beispiel können wir sehen, dass wenn wir einen anderen Wert in a zuweisen, dieser nicht geändert wird. Ein neues Objekt wird erstellt.
Und es kann nicht geändert werden. Beispiel:
Ein Fehler tritt auf.
quelle
'veränderlich' bedeutet, dass wir den Inhalt der Zeichenfolge ändern können. 'unveränderlich' bedeutet, dass wir keine zusätzliche Zeichenfolge hinzufügen können.
quelle
>>> a = 'dogs'
>>> a.replace('dogs', 'dogs eat treats')
'dogs eat treats'
>>> print a
'dogs'
Unveränderlich, nicht wahr?!
Der variable Änderungsteil wurde bereits besprochen.
quelle
replace()
Methode einen neuen String zurückgibt.Betrachten Sie diesen Zusatz zu Ihrem Beispiel
Eine der genaueren Erklärungen, die ich in einem Blog gefunden habe, ist:
Link zum Blog: https://jeffknupp.com/blog/2012/11/13/is-python-callbyvalue-or-callbyreference-neither/
quelle
Den oben genannten Antworten etwas mehr hinzufügen.
id
einer Variablen ändert sich bei Neuzuweisung.Dies bedeutet, dass wir die Variable so mutiert haben, dass sie
a
auf eine neue Zeichenfolge zeigt. Jetzt existieren zweistring
(str) Objekte:'initial_string'
mitid
= 139982120425648und
'new_string'
mitid
= 139982120425776Betrachten Sie den folgenden Code:
Zeigt nun
b
auf das'initial_string'
und hat das gleicheid
wiea
vor der Neuzuweisung.Somit wurde das
'intial_string'
nicht mutiert.quelle
Zusammenfassend:
Nicht unveränderlich:
Unveränderlich:
Dies ist ein Fehler in Python 3, da es unveränderlich ist. Und kein Fehler in Python 2, da es eindeutig nicht unveränderlich ist.
quelle
Die integrierte Funktion
id()
gibt die Identität eines Objekts als Ganzzahl zurück. Diese Ganzzahl entspricht normalerweise der Position des Objekts im Speicher.Zu Beginn wird 'a' im Speicherort 139831803293008 gespeichert, da das Zeichenfolgenobjekt in Python unveränderlich ist, wenn Sie versuchen, die Referenz zu ändern und neu zuzuweisen. Dies wird entfernt und ist ein Zeiger auf einen neuen Speicherort (139831803293120).
quelle
quelle
Dieses Bild gibt die Antwort. Bitte lies es.
quelle
Wir verketten nur die beiden Zeichenfolgenwerte. Wir ändern niemals den Wert von (a). Gerade jetzt (a) repräsentiert einen anderen Speicherblock, der den Wert "dogdog" hat. Denn im Backend repräsentiert eine Variable niemals zwei Speicherblöcke gleichzeitig. Der Wert von (a) vor der Verkettung war "Hund". Aber danach (a) repräsentieren den "Dogdog", weil jetzt (a) im Backend rep. der Block mit dem Wert "dogdog". Und "Hund" ist rep. durch (b) und "Hund" wird nicht als Müllwert gezählt, bis (b) den "Hund" darstellt.
Die Verwirrung ist, dass wir die Speicherblöcke (die Daten oder Informationen enthalten) im Backend mit demselben Variablennamen darstellen.
quelle
Sie können ein Numpy-Array unveränderlich machen und das erste Element verwenden:
dann:
oder
quelle