passing class by reference does not work??

Alex Martelli aleax at mac.com
Wed Apr 11 10:40:17 EDT 2007


wswilson <wswilson 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



More information about the Python-list mailing list