Список ссылок на объекты в 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 

Я ожидаю увидеть сначала 2 печатных, затем 3 , так как я ожидаю, что b[0] укажет на a , который теперь является новым объектом. Вместо этого я вижу 2 и 2 . Что мне здесь не хватает?

В Python оператор присваивания связывает результат выражения правой стороны с именем из выражения левой стороны.

Итак, когда вы говорите

 a = Foo(2) b = [a] 

вы создали объект Foo и ссылаетесь на него. Затем вы создаете список b со ссылкой на объект Foo ( a ). Вот почему b[0].value печатают 2 .

Но,

 a = Foo(3) 

создает новый объект Foo и ссылается на него с именем a . Итак, теперь a относится к новому объекту Foo не к старому объекту. Но в списке все еще есть ссылка только на старый объект. Вот почему он все еще печатает 2.

b[0] указывает на объект, который вы изначально создали с помощью Foo(2) . Когда вы делаете a = Foo(3) , вы создаете новый объект и называете его a . Вы не изменили b никоим образом.

Поведение происходит из-за того, что вы сказали: b содержит ссылку на объект . Он не удерживает ссылку на имя, которое вы использовали для ссылки на этот объект. Таким образом, объект в b[0] ничего не знает о какой-либо переменной, называемой a . Присвоение нового значения a не влияет на b .