2013-05-23 3 views
5

Code:Store Verweis auf primitiven Typ in Python?

>>> a = 1 
>>> b = 2 
>>> l = [a, b] 
>>> l[1] = 4 
>>> l 
[1, 4] 
>>> l[1] 
4 
>>> b 
2 

Was will ich passieren, anstatt sehen, ist, dass, wenn ich l eingestellt [1] gleich 4 ist, dass die Variable b bis 4.

geändert wird, vermute ich, dass, wenn Beim Umgang mit Primitiven werden sie nach Wert und nicht nach Referenz kopiert. Oft sehe ich, dass Menschen Probleme mit Objekten haben und tiefe Kopien und ähnliches verstehen müssen. Ich will grundsätzlich das Gegenteil. Ich möchte in der Lage sein, eine Referenz auf das Primitiv in der Liste zu speichern, dann in der Lage sein, neue Werte zu dieser Variablen entweder mithilfe seiner tatsächlichen Variablenname b oder seine Referenz in der Liste l[1] zuweisen.

Ist das möglich?

+0

Sie haben 'l' mit einer Referenz zu "b", nicht umgekehrt. –

+0

diese Frage ist sehr abstrakt. Versuchen Sie mehr darüber zu erfahren, wie Python funktioniert (im Vergleich zu anderen Sprachen, die Sie vielleicht kennen) oder versuchen Sie, dies als Lösung für etwas zu verwenden? Welches Problem versuchen Sie zu lösen? – SingleNegationElimination

Antwort

3

Sie können nicht wirklich tun, dass in Python, aber Sie schließen, indem die Variablen kommen können a und b beziehen sich auf wandelbar Container-Objekte anstelle von unveränderlichen Zahlen:

>>> a = [1] 
>>> b = [2] 
>>> lst = [a, b] 
>>> lst 
[[1], [2]] 
>>> lst[1][0] = 4 # changes contents of second mutable container in lst 
>>> lst 
[[1], [4]] 
>>> a 
[1] 
>>> b 
[4] 
+0

Diese Antwort und die darüber stehende Aussage sagen grundsätzlich dasselbe auf verschiedene Arten ... Danke, dass du die unveränderliche vs. primitive Verwirrung für mich aufgeräumt hast! – fdmillion

6

In Python gibt es keine "Primitiven". Alles ist ein Objekt, gerade Zahlen. Zahlen in Python sind unveränderliche Objekte. Um einen Bezug auf eine Nummer zu haben, so dass "Änderungen" der "Nummer" durch mehrere Referenzen "gesehen" werden, muss die Referenz z.B. eine einzelne Elementliste oder ein Objekt mit einer Eigenschaft.

(Dies funktioniert, weil Listen und Objekte wandelbar sind und eine Änderung an, welche Zahl sie halten durch alle Verweise auf sie zu sehen)

z.B.

>>> a = [1] 
>>> b = a 
>>> a 
[1] 
>>> b 
[1] 
>>> a[0] = 2 
>>> a 
[2] 
>>> b 
[2] 
0

Ich glaube nicht, das ist möglich:

>>> lst = [1, 2] 
>>> a = lst[1] # value is copied, not the reference 
>>> a 
2 
>>> lst[1] = 3 
>>> lst 
[1, 3] # list is changed 
>>> a # value is not changed 
2 

a auf den ursprünglichen Wert von lst[1] bezieht, sondern direkt bezieht sich nicht auf sie.

0

Denken Sie an l[0] als ein Name, der sich auf ein Objekt a bezieht, und a als ein Name, der sich auf eine ganze Zahl bezieht.

Ganzzahlen sind unveränderlich, Sie können Namen auf verschiedene Ganzzahlen beziehen, aber Ganzzahlen selbst können nicht geändert werden.