2015-05-08 1 views
5

Ich bin mir bewusst, dass diese Frage bereits hier in one Form oder another gestellt wurde, aber keine der Antworten adressiert das Verhalten, das ich sehe. Ich gebe zu verstehen, dass eine Liste von Objekten nur Referenzen zu diesen Objekten enthalten sollte. Was ich beobachte scheint dies zu kontrahieren:Liste der Objektreferenzen in Python

class Foo(object): 
    def __init__(self,val): 
     self.value=val 

a = Foo(2) 
b = [a] 
print b[0].value 

a = Foo(3) 
print b[0].value 

Ich erwarte, dass erste 2 gedruckt sehen, dann 3, da ich b[0] erwarten a zu zeigen, die jetzt ein neues Objekt. Stattdessen sehe ich 2 und 2. Was fehlt mir hier?

Antwort

2

In Python, Zuweisungsoperator bindet das Ergebnis der rechten Seite Ausdruck auf den Namen von der linken Seite Ausdruck.

Also, wenn Sie

a = Foo(2) 
b = [a] 

sagen Sie haben eine Foo Objekt erstellt und beziehen es mit a. Dann erstellen Sie eine Liste b mit dem Verweis auf das Objekt Foo (a). Deshalb b[0].value druckt 2.

Aber

a = Foo(3) 

erstellt ein neues Objekt Foo und bezieht sich, dass mit dem Namen a. So, jetzt a bezieht sich auf das neue Objekt Foo nicht das alte Objekt. Die Liste hat jedoch immer noch nur einen Verweis auf das alte Objekt. Deshalb druckt es noch 2.

3

b[0] verweist auf das Objekt, das Sie ursprünglich mit Foo(2) erstellt haben. Wenn Sie a = Foo(3) machen, erstellen Sie ein neues Objekt und nennen es a. Sie haben b in keiner Weise geändert.

Das Verhalten ist wegen genau das, was Sie sagten: b enthält einen Verweis auf Objekt. Es enthält keinen Verweis auf den Namen, den Sie verwendet haben, um auf dieses Objekt zu verweisen. Das Objekt in b[0] weiß also nichts über eine Variable namens a. Das Zuweisen eines neuen Werts zu a hat keine Auswirkung auf b.

+0

* Slaps Stirn *. Vielen Dank. Alles aufgeklärt. – aslanides