Ich mache das:
a = 'hello'
Und jetzt möchte ich nur eine unabhängige Kopie von a
:
import copy
b = str(a)
c = a[:]
d = a + ''
e = copy.copy(a)
map( id, [ a,b,c,d,e ] )
Out [3]:
[4365576160, 4365576160, 4365576160, 4365576160, 4365576160]
Warum haben alle dieselbe Speicheradresse und wie kann ich eine Kopie davon erhalten a
?
python
string
python-2.7
üblich ich
quelle
quelle
d[ 'hello' ] = e
, woe[ 'hi' ] = 'again'
. Um ein solches verschachteltes Wörterbuch zu generieren, habe ich ein einzelnese
Wörterbuch generiert und es mehrmals kopiert. Mir ist aufgefallen, dass der Speicherverbrauch sehr gering war, was hier zu meiner Frage führte. Jetzt verstehe ich, dass keine String-Kopien erstellt wurden, daher der geringe Speicherverbrauch.b
eine modifizierte Version von sein möchten ,a
ohne sie zu änderna
, lassen Sieb
einfach das Ergebnis einer beliebigen Operation sein. zBb = a[2:-1]
setztb
auf'll'
unda
bleibt 'hello'
.Antworten:
Sie müssen nicht benötigen eine Python - Zeichenfolge zu kopieren. Sie sind unveränderlich, und das
copy
Modul gibt in solchen Fällen immer das Original zurück, ebenso wiestr()
das gesamte String-Slice und die Verkettung mit einem leeren String.Darüber hinaus ist Ihre
'hello'
Zeichenfolge interniert ( bestimmte Zeichenfolgen sind ). Python versucht absichtlich, nur eine Kopie zu behalten, da dies die Suche nach Wörterbüchern beschleunigt.Eine Möglichkeit, dies zu umgehen, besteht darin, eine neue Zeichenfolge zu erstellen und diese Zeichenfolge dann wieder auf den ursprünglichen Inhalt zurückzuschneiden:
Aber alles, was Sie jetzt tun, ist Speicherverschwendung. Es ist schließlich nicht so, dass Sie diese Zeichenfolgenobjekte auf irgendeine Weise mutieren können.
Wenn Sie nur wissen möchten, wie viel Speicher ein Python-Objekt benötigt, verwenden Sie
sys.getsizeof()
; Es gibt Ihnen den Speicherbedarf jedes Python-Objekts.Bei Containern ist der Inhalt nicht enthalten. Sie müssten in jeden Container zurückgreifen, um eine Gesamtspeichergröße zu berechnen:
Sie können dann die
id()
Verfolgung verwenden, um einen tatsächlichen Speicherbedarf zu ermitteln oder einen maximalen Speicherbedarf zu schätzen, wenn Objekte nicht zwischengespeichert und wiederverwendet wurden.quelle
b = ''.join(a)
.Sie können eine Zeichenfolge in Python über die Zeichenfolgenformatierung kopieren:
quelle
b = '{:s}'.format(a)
Ich fange gerade mit einigen String-Manipulationen an und habe diese Frage gefunden. Ich habe wahrscheinlich versucht, so etwas wie das OP zu machen, "normal ich". Die vorherigen Antworten haben meine Verwirrung nicht geklärt, aber nachdem ich ein wenig darüber nachgedacht hatte, habe ich es endlich "verstanden".
Solange
a
,b
,c
,d
, unde
den gleichen Wert haben , verweisen sie an der gleichen Stelle. Speicher wird gespeichert. Sobald die Variable unterschiedliche Werte aufweist, erhalten sie unterschiedliche Referenzen. Meine Lernerfahrung ergab sich aus diesem Code:Die gedruckte Ausgabe ist:
quelle
Das Kopieren einer Zeichenfolge kann auf zwei Arten erfolgen: Kopieren Sie entweder die Position a = "a" b = a oder Sie können klonen, was bedeutet, dass b nicht betroffen ist, wenn a geändert wird, was durch a = 'a' b = a [:] erfolgt.
quelle
Anders ausgedrückt: "id ()" ist nicht das, was Sie interessiert. Sie möchten wissen, ob der Variablenname geändert werden kann, ohne den Namen der Quellvariablen zu beschädigen.
Wenn Sie an C gewöhnt sind, sind diese wie Zeigervariablen, außer dass Sie sie nicht de-referenzieren können, um zu ändern, worauf sie zeigen, aber id () sagt Ihnen, wohin sie aktuell zeigen.
Das Problem für Python-Programmierer tritt auf, wenn Sie tiefere Strukturen wie Listen oder Diktate betrachten:
Hier beziehen sich o und x auf dasselbe Diktat o ['a'] und x ['a'], und dieses Diktat ist in dem Sinne "veränderlich", dass Sie den Wert für Schlüssel 'a' ändern können. Deshalb muss "y" eine Kopie sein und y ['a'] kann sich auf etwas anderes beziehen.
quelle