2013-09-25 5 views
6

Ich habe seit einiger Zeit Python wurde mit bereits heute während des folgenden Code-Schnipsel zu lesen:Python Tupel unveränderlich ist - also warum kann ich hinzufügen, Elemente, um es

>>> a = (1,2) 
>>> a += (3,4) 
>>> a 
(1, 2, 3, 4) 

ich mir eine Frage gestellt: Wie kommt Python Tupel sind unveränderlich und ich kann einen += Operator auf ihnen verwenden (oder, allgemeiner, warum kann ich ein Tupel modifizieren)? Und ich konnte mich nicht selbst beantworten.

Ich bekomme die Idee der Unveränderlichkeit, und, obwohl sie nicht so populär wie Listen sind, sind Tupel in Python nützlich. Aber unveränderlich zu sein und die Länge ändern zu können, scheint mir widersprüchlich ...

+0

Siehe http://stackoverflow.com/questions/9097994/arent-python-strings-immutable –

+0

@ColonelPanic ja, ein bisschen ähnliches Problem – ducin

Antwort

22

5 ist auch unveränderlich. Wenn Sie eine unveränderliche Datenstruktur haben, entspricht a += ba = a + b, also eine neue Zahl, Tupel oder was auch immer erstellt wird.

Wenn dies mit veränderbaren Strukturen geschieht, ist die Struktur geändert.

Beispiel:

>>> tup = (1, 2, 3) 
>>> id(tup) 
140153476307856 
>>> tup += (4, 5) 
>>> id(tup) 
140153479825840 

Sehen Sie, wie die id verändert? Das bedeutet, es ist ein anderes Objekt.

Jetzt mit einem list, die wandelbar ist:

>>> lst = [1, 2, 3] 
>>> id(lst) 
140153476247704 
>>> lst += [4, 5] 
>>> id(lst) 
140153476247704 

Die id sagt das gleiche.

+1

ok, also noch kann ich nicht hinzufügen, ein Element zu einem vorhandenen Tupel (was es wirklich unveränderlich macht), aber ein neues Objekt wird auf der Basis von zwei anderen Objekten erstellt - ist das richtig? – ducin

+0

Das ist genau richtig. – Veedrac

+0

Nur eine Sache ist in Ihren Schnipsel noch nicht klar. tuple :: '+ =' verwendet zwei Tupel, um das dritte Tupel zu erzeugen. Scheint wie es; s anders mit list :: '+ =' - weil es logisch wäre, wenn es dasselbe tun würde (und eine dritte Liste erstellen). Aber "lst + [4,5]" macht tatsächlich zweimal anhängen. Warum folgt 'list :: + =' tuple :: + = 'nicht? – ducin

2

Sie es nicht ändern, erstellt ein neues Tupel und verändert den Inhalt der a Variable

a[0] = a[0] + 1 versuchen, die Unveränderlichkeit bis zu

4

Ob += modifiziert das Objekt an Ort und Stelle oder nicht, ist zu sehen, das Objekt. Mit einem Tupel, Sie sind nicht das Objekt ändern, wie Sie sehen können, wenn Sie eine andere Variable zeigt auf das gleiche Objekt erstellen:

>>> x = (1, 2) 
>>> y = x 
>>> x += (3, 4) 
>>> y 
(1, 2) 

mit veränderbare Objekte wie Listen, sehen Sie, dass sich der Wert ändert, zeigt up unter allen seinen Namen:

>>> x = [1, 2] 
>>> y = x 
>>> x += [3, 4] 
>>> y 
[1, 2, 3, 4] 
+0

Basierend auf Ihrer Antwort basiert das Verhalten von '+ =' operator auf veränderbarem/unveränderlichem Ding und ist an Ort und Stelle bzw. nicht an Ort und Stelle. Vielen Dank. – ducin

+1

@tkoomzaaskz: Eigentlich ist das Verhalten von '+ =' jedem Typ überlassen. Wenn ein Typ eine Methode '__iadd__' definiert, ruft Python diese auf; Andernfalls wird stattdessen '__add__' (dieselbe Methode, die für '+' verwendet wird) aufgerufen. Die meisten unveränderlichen Typen definieren nicht "__iadd__", also ist "a + = b" dasselbe wie "a = a + b"; die meisten veränderbaren Typen _do_ definieren "__iadd__", also mutiert es sie an Ort und Stelle. – abarnert

Verwandte Themen