Heim  >  Artikel  >  Backend-Entwicklung  >  Eine kurze Einführung in die sequenzielle Zuweisung in Python (mit Beispielen)

Eine kurze Einführung in die sequenzielle Zuweisung in Python (mit Beispielen)

不言
不言nach vorne
2018-10-08 16:29:243023Durchsuche

Dieser Artikel bietet Ihnen eine kurze Einführung in die sequenzielle Zuweisung in Python (mit Beispielen). Ich hoffe, dass er Ihnen als Referenz dienen wird.

Die inkrementellen Zuweisungsoperatoren sind += und *=. Die spezielle Methode hinter += ist __iadd__. Wenn eine Klasse die Methode __iadd__ nicht implementiert, geht Python einen Schritt zurück und ruft sie auf __add__-Methode. Der Unterschied zwischen diesen beiden Methoden besteht darin, dass __iadd__ eine direkte Änderung ist und die Speicheradresse des ursprünglichen Werts nicht ändert, während die Methode __add__ ein neues Objekt erhält.

Betrachten Sie den folgenden Ausdruck:

a += b

Wenn a die Methode __iadd__ implementiert, wird a an Ort und Stelle geändert (die Speicheradresse bleibt unverändert). Wenn a die Methode __iadd__ nicht implementiert, ist die Wirkung des Ausdrucks a += b dieselbe wie bei a = a + b, wodurch ein neues Objekt generiert und a zugewiesen wird.

Im Allgemeinen implementieren veränderliche Sequenzen im Allgemeinen die __iadd__-Methode, sodass += eine In-Place-Addition ist, während unveränderliche Sequenzen diesen Vorgang überhaupt nicht unterstützen.

*= ist dasselbe wie +=, außer dass die spezielle Methode dahinter __imul__ ist.

a = [1, 2, 3]
b = [4, 5, 6]print("id(a) = %d" % id(a))
a += bprint("id(a) = %d" % id(a))

c = [1, 2, 3]print("id(c) = %d" % id(c))
c = c + bprint("id(c) = %d" % id(c))

d = (1, 2, 3)print("id(d) = %d" % id(d))
d *= 2print("id(d) = %d" % id(d))

Die laufenden Ergebnisse lauten wie folgt:

id(a) = 1298277978824
id(a) = 1298277978824
id(c) = 1298277978696
id(c) = 1298277978632
id(d) = 1298277972872
id(d) = 1298277136616

Versteht die inkrementelle Zuweisung von Schauen wir uns das von Leonardo Rochael auf der Python Brazil Conference 2013 erwähnte Rätsel an:

t = (1, 2, [30, 40])
t[2] += [50, 60]

A.t wird zu (1, 2, [30 , 40, 50, 60])

Da Tupel keine Zuweisung zu seinen Elementen unterstützt, wird eine TypeError-Ausnahme ausgelöst

Keines der oben genannten

Beides A und B sind richtig

Ich denke, viele Leute werden sich wie ich für B entscheiden, aber tatsächlich lautet die Antwort D. Führen Sie den Code auf der Konsole aus und die Ergebnisse sind wie folgt:

Zusammenfassung:

1. Wenn Sie wiederholte Spleißvorgänge durchführen Bei unveränderlichen Sequenzen ist die Effizienz sehr gering, da Sie jedes Mal eine neue Sequenz erstellen, dann die Elemente in der ursprünglichen Sequenz in die neue Sequenz kopieren und dann neue Elemente anhängen müssen.

2. Platzieren Sie keine veränderlichen Objekte in Tupeln.

3. Die inkrementelle Zuweisung ist keine atomare Operation. Wir haben gerade gesehen, dass sich der Wert von t dennoch ändert.

Das obige ist der detaillierte Inhalt vonEine kurze Einführung in die sequenzielle Zuweisung in Python (mit Beispielen). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:cnblogs.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen

In Verbindung stehende Artikel

Mehr sehen