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