The following code is not working as expected: import weakref class cls1: def giveTo( self, to ): to.take( self.bla ) def bla(self ): pass class cls2: def take( self, what ): self.ref = weakref.ref(what) c1 = cls1() c2 = cls2() c1.giveTo( c2 ) print c1.bla print c2.ref It prints out: <bound method cls1.bla of <__main__.cls1 instance at 0x00CA9E18>> <weakref at 00CAF180; dead> Why is the weakref pointing to a dead object, when it's still alive?
Because self.bla is a bound-method object, which is created and then instantly deleted as unreferenced. This is not a bug, it is expected. >>> class X: ... def foo (self): pass ... >>> x = X () >>> x.foo is x.foo False Note how the objects are different.
It's easier to see what is going on if you print the object ids. The id of self.bla is different than the subsequent c1.bla. The first is freed before the second gets created.