passing class by reference does not work??

wswilson wswilson at gmail.com
Wed Apr 11 10:48:57 EDT 2007


On Apr 11, 10:40 am, a... at mac.com (Alex Martelli) wrote:
> wswilson <wswil... at gmail.com> wrote:
> > Here is my code:
>
> > class A():
> >       val = 0
>
> > def b(item, a):
> >       a.val = a.val + 1
> >       return item + a.val
>
> > def c():
> >       d = [1, 2, 3]
> >       print [b(item, A()) for item in d]
>
> > c()
>
> > I expected this to output [2, 4, 6]. However, it outputs [2, 3, 4]
> > which is not what I wanted. I thought that if I passed the A()
> > instance in my list comprehension in c(), then the changes I made to
> > a.val in b() would be reflected in the A() instance next time the list
> > comprehension called b(). But, obviously that is not happening. I'm
> > kinda new at python so I may be missing something obvious here.
>
> Yep:
>
> a.val = a.val + 1
>
> sets in INSTANCE variable a the value computed on the RHS.  A.val (the
> CLASS variable) is never changed.  You're not "passing the class", of
> course, but rather an instance of the class.
>
> To increment A.val, you need to assign to the class variable, or write
> some method in class A which assigns to the class variable.  If you
> want, you can change class A only, leaving all of the rest of your code
> untouched, with a property (but then A needs to be newstile), e.g.:
>
> class A(object):
>     _val = 0
>     def getval(self): return A._val
>     def setval(self, value): A._val = value
>     val = property(getval, setval)
>
> now your code should work as intended: any read access to a.val returns
> A._val, and any setting of a.val actually sets A._val, as you appear to
> desire.
>
> Alex

Thanks, that should work well. I appreciate it.




More information about the Python-list mailing list