Ich habe versucht, mehrere Zuweisungen wie unten gezeigt zu verwenden, um Variablen zu initialisieren, aber ich war durch das Verhalten verwirrt. Ich erwarte, die Werteliste separat neu zuzuweisen. Ich meine, b [0] und c [0] sind wie zuvor gleich 0.
a=b=c=[0,3,5]
a[0]=1
print(a)
print(b)
print(c)
Ergebnis ist: [1, 3, 5] [1, 3, 5] [1, 3, 5]
Ist das korrekt? Was soll ich für Mehrfachzuweisungen verwenden? Was ist anders daran?
d=e=f=3
e=4
print('f:',f)
print('e:',e)
Ergebnis: ('f:', 3) ('e:', 4)
a
,b
undc,
an alle auf den gleichen Wert (in diesem Fall eine Liste), oder wollen Siea=0
,b=3
undc=5
. In diesem Fall möchten Siea,b,c = [0,3,5]
oder nura,b,c = 0,3,5
.Antworten:
Wenn Sie aus einer Sprache in C / Java / etc. Zu Python kommen. Familie, es kann Ihnen helfen, nicht mehr
a
als "Variable" zu denken und es als "Namen" zu betrachten.a
,,b
undc
sind keine unterschiedlichen Variablen mit gleichen Werten; Es sind verschiedene Namen für denselben identischen Wert. Variablen haben Typen, Identitäten, Adressen und dergleichen.Namen haben nichts davon. Werte tun dies natürlich, und Sie können viele Namen für denselben Wert haben.
Wenn Sie
Notorious B.I.G.
einen Hot Dog geben *Biggie Smalls
undChris Wallace
einen Hot Dog haben. Wenn Sie das erste Element vona
in 1 ändern , sind die ersten Elemente vonb
undc
1.Wenn Sie wissen möchten, ob zwei Namen dasselbe Objekt benennen, verwenden Sie den
is
Operator:Sie fragen dann:
Hier binden Sie den Namen erneut
e
an den Wert4
. Das hat keinen Einfluss auf die Namend
undf
in keiner Weise.In Ihrer vorherigen Version haben Sie zugewiesen
a[0]
, nicht zua
. Aus der Sicht vona[0]
binden Sie also neua[0]
, aber aus der Sicht vona
ändern Sie es an Ort und Stelle.Sie können die
id
Funktion verwenden, die Ihnen eine eindeutige Nummer gibt, die die Identität eines Objekts darstellt, um genau zu sehen, welches Objekt welches ist, auch wennis
dies nicht helfen kann:Beachten Sie, dass
a[0]
sich dieser Wert von 4297261120 in 4297261216 geändert hat. Es handelt sich nun um einen Namen für einen anderen Wert. Undb[0]
ist jetzt auch ein Name für den gleichen neuen Wert. Das liegt darana
undb
benennt immer noch dasselbe Objekt.Unter dem Deckmantel
a[0]=1
wird tatsächlich eine Methode für das Listenobjekt aufgerufen. (Es ist gleichbedeutend mita.__setitem__(0, 1)
.) Es bindet also überhaupt nichts wirklich neu. Es ist wie ein Anrufmy_object.set_something(1)
. Sicher, wahrscheinlich bindet das Objekt ein Instanzattribut neu, um diese Methode zu implementieren, aber das ist nicht wichtig. Wichtig ist, dass Sie nichts zuweisen, sondern nur das Objekt mutieren. Und so ist es auch mita[0]=1
.user570826 fragte:
Das ist genau die gleiche Situation wie
a = b = c = [1, 2, 3]
: Sie haben drei Namen für den gleichen Wert.In diesem Fall ist der Wert jedoch ein
int
undint
s sind unveränderlich. In jedem Fall können Sie rebinda
auf einen anderen Wert (zBa = "Now I'm a string!"
), aber das wird nicht den ursprünglichen Wert beeinflussen, wasb
undc
noch sein wird Namen. Der Unterschied besteht darin, dass Sie mit einer Liste den Wert[1, 2, 3]
in ändern können[1, 2, 3, 4]
indem zBa.append(4)
; da dies tatsächlich den Wert ändert, für denb
undc
Namen sind,b
wird nun b[1, 2, 3, 4]
. Es gibt keine Möglichkeit, den Wert10
in etwas anderes zu ändern .10
ist für immer 10, genau wie Claudia ist der Vampir für immer 5 (zumindest bis sie durch Kirsten Dunst ersetzt wird).* Warnung: Geben Sie Notorious BIG keinen Hot Dog. Gangsta-Rap-Zombies sollten niemals nach Mitternacht gefüttert werden.
quelle
have, a = b = c = 10;
und wenn wir versuchen, den Wert von b zu aktualisieren, wirkt sich dies auf andere aus? obwohl ich überprüft habe, dass ihre IDs gleich sind.10
ist unveränderlich - das heißt, es gibt keine Möglichkeit, den Wert zu aktualisieren, sodass Ihre Frage keinen Sinn ergibt. Sie könnenb
auf einen anderen Wert zeigen, dies hat jedoch keine Auswirkungen aufa
undc
, die immer noch auf den ursprünglichen Wert zeigen. Der Unterschied, den Listen machen, besteht darin, dass sie veränderbar sind - z. B. können Sieappend
eine Listelst[0] = 3
erstellen oder , und das aktualisiert den Wert, der durch alle Namen für diesen Wert sichtbar ist.Hust hust
quelle
a,b,c = 1,2,3
ohne Klammern funktioniert in Python 2 oder 3, wenn Sie wirklich diese zusätzliche cm Lesbarkeit wollen.Ja, das ist das erwartete Verhalten. a, b und c werden alle als Beschriftungen für dieselbe Liste festgelegt. Wenn Sie drei verschiedene Listen möchten, müssen Sie diese einzeln zuweisen. Sie können entweder die explizite Liste wiederholen oder eine der zahlreichen Möglichkeiten zum Kopieren einer Liste verwenden:
Zuweisungsanweisungen in Python kopieren keine Objekte - sie binden den Namen an ein Objekt, und ein Objekt kann so viele Beschriftungen haben, wie Sie festlegen. Bei Ihrer ersten Bearbeitung, bei der Sie a [0] ändern, aktualisieren Sie ein Element der einzelnen Liste, auf die sich a, b und c beziehen. In Ihrem zweiten, wenn Sie e ändern, ändern Sie e als Beschriftung für ein anderes Objekt (4 statt 3).
quelle
In Python ist alles ein Objekt, auch "einfache" Variablentypen (int, float usw.).
Wenn Sie einen Variablenwert ändern, ändern Sie tatsächlich seinen Zeiger , und wenn Sie zwischen zwei Variablen vergleichen, werden deren Zeiger verglichen . (Um klar zu sein, Zeiger ist die Adresse im physischen Computerspeicher, in der eine Variable gespeichert ist).
Wenn Sie also einen inneren Variablenwert ändern, ändern Sie dessen Wert im Speicher und wirken sich auf alle Variablen aus, die auf diese Adresse verweisen.
Für Ihr Beispiel, wenn Sie Folgendes tun:
Dies bedeutet, dass a und b auf dieselbe Adresse im Speicher zeigen, die den Wert 5 enthält, aber wenn Sie dies tun:
Es hat keinen Einfluss auf b, da a jetzt auf einen anderen Speicherort zeigt, der 6 enthält, und b immer noch auf die Speicheradresse zeigt, die 5 enthält.
Aber wenn Sie dies tun:
a und b zeigen wieder auf dieselbe Position, aber der Unterschied besteht darin, dass, wenn Sie einen der Listenwerte ändern:
Es ändert den Wert des Speichers, auf den a zeigt, aber a zeigt immer noch auf dieselbe Adresse wie b, und infolgedessen ändert sich auch b.
quelle
PyObject
. Dies gilt nicht für andere Implementierungen wie PyPy oder Jython. (In der Tat ist es nicht einmal klar , wie es könnte wahr sein, weil die Sprachen diese Implementierungen geschrieben in Zeiger haben nicht einmal.)Mit können Sie
id(name)
überprüfen, ob zwei Namen dasselbe Objekt darstellen:Listen sind veränderlich; Dies bedeutet, dass Sie den vorhandenen Wert ändern können, ohne ein neues Objekt zu erstellen. Dies hängt jedoch davon ab, wie Sie den Wert ändern:
Wenn Sie eine neue Liste zuweisen
a
, ändert sich ihre ID, sodass sie die Werte vonb
und nicht beeinflusstc
:Ganzzahlen sind unveränderlich, sodass Sie den Wert nicht ändern können, ohne ein neues Objekt zu erstellen:
quelle
id
ist nicht unbedingt ein Speicherort. Wie die Dokumente sagen, gibt dies die "Identität ... eine Ganzzahl ... zurück, die für dieses Objekt während seiner Lebensdauer garantiert eindeutig und konstant ist". CPython verwendet zufällig die Speicheradresse alsid
, andere Python-Implementierungen jedoch möglicherweise nicht. PyPy zum Beispiel nicht. Und zu sagen, "zwei Vars zeigen auf denselben Speicherort", ist für jeden, der es im C-Stil versteht, irreführend. "Zwei Namen für dasselbe Objekt" ist genauer und weniger irreführend.In Ihrem ersten Beispiel
a = b = c = [1, 2, 3]
sagen Sie wirklich:Wenn Sie 'a' gleich 1, 'b' gleich '2' und 'c' gleich 3 setzen möchten, versuchen Sie Folgendes:
Hoffe das hilft!
quelle
Einfach ausgedrückt, im ersten Fall weisen Sie a mehrere Namen zu
list
. Es wird nur eine Kopie der Liste im Speicher erstellt, und alle Namen beziehen sich auf diesen Speicherort. Wenn Sie also die Liste mit einem der Namen ändern, wird die Liste im Speicher geändert.Im zweiten Fall werden mehrere Kopien desselben Werts im Speicher erstellt. Jede Kopie ist also unabhängig voneinander.
quelle
Was Sie brauchen, ist Folgendes:
quelle
Der Code, der das tut, was ich brauche, könnte folgender sein:
Ergebnis:
quelle