2016-08-23 2 views
-1

Ich betrat das folgende in der Befehlszeile:Ändern von Werten von Tupelelemente

>>>a = 25 
>>>b = 50 
>>>t = (a, b) 
>>>t 
(25, 50) 
>>>a = 50 
>>>t 
(25, 50) 
>>>t = (a, b) 
>>>t 
(50, 50) 

Warum muss ich das Tupel (a, b)-t neu zuzuweisen haben die Änderung in a ‚s-Wert zu sehen?

+2

Teil des Konzepts der Tupel ist, dass Sie ihren Wert nicht ändern können. Wenn Sie den Wert eines Variablenindex ändern möchten, sollten Sie möglicherweise Listen verwenden. –

+0

So funktioniert das. Das gleiche gilt für Listen: '[a, b]' gibt dir '[25, 50]' und hält keine Referenzen auf 'a' oder' b'. Das gleiche gilt für Variablen: Wenn Sie 'x = a' verwenden, dann wirkt sich' a = 75' nicht auf 'x' aus. – Blorgbeard

+0

Siehe auch http://stackoverflow.com/questions/6158907/what-does-python-treat-as-reference-types – Blorgbeard

Antwort

0

Es ist einfach. In Python sind die Namen wie a und b und t nicht Objekte, sie zeigen nur auf Objekte. Wenn Sie

>>> a = 25 
>>> b = 50 

eingeben a Python setzt der Name 25 und b zu einem int Objekt mit Wert Punkt 50 mit Wert zu int Objekt zu zeigen.

beim Erstellen eines Tupels mit

>>> t = a, b 

(ohne Klammern hier erforderlich!) Sie sagen Python, dass "bitte ein neues Tupel aus 2 Elementen erstellt, dessen erste Position auf das Objekt ajetzt zeigen sollte, und die zweite Position sollte auf das Objekt zeigen, das bjetzt zeigt . Eigentlich wäre es auch in ähnlicher Weise mit einer Liste, oder setzen sie arbeiten:

>>> l = [a, b] 
>>> s = {a, b} 

nun ist die nächste Anweisung:

>>> a = 50 

Means „jetzt, a zu einem int-zu-Punkt gesetzt o bject mit Wert von 50 ". Das erste Element des Tupels zeigt weiterhin auf 25. Eigentlich alle Zuweisungen an Variablen auf diese Weise in Python verhalten, kann der Wert in a wandelbar oder nicht:

>>> a = [1, 2] 
>>> b = [3, 4] 
>>> t = a, b 
>>> a = [5, 6] 
>>> t 
([1, 2], [3, 4]) 

Obwohl a Punkte auf ein veränderbares Wert, eine Liste, dann bedeutet a, b * ein neues Tupel mit dem ersten Element machen das Objekt zu sein, das in diesem Moment auf a zeigt, und das zweite Element ist das Objekt, das in diesem Moment auf b zeigt; und dann a = [5, 6] bedeutet * erstellen Sie eine neue Liste ... und machen Sie jetzt a zeigen Sie darauf. Die Variablen (Namen) in Python sind zwar keine "Boxen", aber sie sind eine Art Zeichen, die auf die Werte zeigen.

+0

Danke. Sehr hilfreich. – BruceM

1

Dies hat weniger mit Tupeln zu tun und mehr mit der Funktionsweise der Zuweisung in Python zu tun, die Referenzen kopiert.

Dies funktioniert für andere Containertypen (Listen) und einfache Variablen.

>>> a = 2 
>>> b = [1, a] 
>>> a = 7 
>>> b 
[1, 2] 
>>> c = 1 
>>> d = c 
>>> c = 2 
>>> d 
1 
+0

Kein Kopieren ist erfolgt. Es ist nur so, dass 'a' und das erste Element der Liste denselben Wert haben. Wenn "a" neu zugewiesen wird, bedeutet dies lediglich, dass sich "a" auf ein anderes Objekt bezieht. Es ändert nicht, was das erste Element der Liste ist. – zondo

1

Sie es auf diese Weise verstehen: -

>>> a =25 
>>> b = 50 
>>> id(a) 
6070712 
>>> t = (a, b) 
>>> id(t[0]) 
6070712 
>>> a = 50 
>>> id(a) 
6070412 
# When you assigned a = 50, it created new object, 
#id(t[0]) and a is not same now, so t is still (25, 50) 

Dies geschah, weil int unveränderlich ist, jedes Mal einen Wert zu, neues Objekt zuweisen würde erstellt werden.

Wiederholen derselben mit wandelbaren Typ (die an Ort und Stelle verändert werden kann)

>>> ls1 = [1,2] 
>>> ls2 = [3,4] 
>>> t = (ls1, ls2) 
>>> ls1[0] = 23 
>>> t 
([23, 2], [3, 4]) 
>>> id(ls1) 
54696136 
>>> id(t[0]) 
54696136 
#here t[0] and ls1 are same object because we could modify ls1 in place 

Ich hoffe, dass es helfen würde.

1

Zunächst kann der Wert in Tupel in Python nicht geändert werden. Sie können nur ein neues Tupel deklarieren.

a = 25 bedeutet a ist eine Variable. Die a in t gehören jedoch zum Tupel t. Es hat keine Beziehung mit der Variablen a.

Die zweite t = (a, b) genauso wie t = (50, 50)

Darüber hinaus können Sie id(a) und id(t) verwenden den Unterschied in Ihrer Speicheradresse zu sehen.

0

Wenn wir eine Assign-Aktion wie a = b ausführen und b unveränderlich ist (Zahl, String, Tupel usw.), wird Assign eine Kopie erstellen, anstatt eine Referenz zu erstellen. Als Ergebnis ändern Sie die a nicht zu b.

Für wandelbar Situation:

>>> a = [] 
>>> b = 3 
>>> c = (a, b) 
>>> c 
([], 3) 
>>> a.append(1) 
>>> c 
((1], 3) 
Verwandte Themen