2017-05-18 5 views
0

Ich möchte den Wert eines Mitglieds eines Objekts ändern. Ich kann das tun, solange ich das Objekt selbst adressiere. Wenn ich jedoch einen Verweis auf dieses Mitglied speichere, funktioniert es nicht. Stattdessen ändert es das Referenzobjekt.Referenzobjekte für den Zugriff auf Mitglieder

class MyClass: 
    def __init__(self, name): 
     self.a = 1 
     self.b = name 

obj1=MyClass("string") 
refob1=obj1.a 
refob2=obj1.b 

#I can change my object like this: 
obj1.a=99 
obj2.b="changed" 


#But not like this: 
refob1 = 1 
refob2 = "changed_reference" 

Wie kann ich das Referenzobjekt verwenden, um die Mitglieder zu ändern?

+0

Dies ist nicht speziell für Instanzen. Du würdest dasselbe mit 'foo = 3',' foref = foo', 'foo = 4' bekommen. Sie springen einen Namen zurück, um auf ein neues Objekt zu zeigen, so dass "foref" diese Änderung nicht mehr sehen wird. –

Antwort

2

Dies liegt daran, int und strings in Python sind nicht veränderbare Objekte. Dies bedeutet, dass sie eine Kopie des Werts anstelle der Referenz übergeben.

list s, andererseits sind veränderbare Objekte und erlauben Ihr gewünschtes Verhalten. Hier haben Sie ein Beispiel:

class MyClass(object): 
    def __init__(self): 
     self.a = 3 
     self.b = [1] 

obj = MyClass() 
outside_a = obj.a 
outside_a = 3 # outside_a is just a copy of obj.a value, so it won't change obj object 
outisde_b = obj.b 
outside_b[0] = 3 # Lists are mutabe, so this will change obj.b value 
print obj.b # Prints [3] 

Also, wie können Sie das umgehen? Es ist ein bisschen hässlich, aber Sie können einen Container (Liste) verwenden, um die Variablen zu enthalten, die Sie später referenzieren möchten. Hier finden Sie einen verwandten Artikel: Python passing an integer by reference

Verwandte Themen