Pass by reference

Bruno Desthuilliers bruno.42.desthuilliers at websiteburo.invalid
Wed Dec 31 06:59:18 EST 2008

iu2 a écrit :
> Hi,
> Is it possible somehow to change a varible by passing it to a
> function?

For which definition of "change a variable" ?

> I tried this:
> def change_var(dict0, varname, val):
>   dict0[varname] = val

Ok, this is mutating dict0, so it works.

> def test():
>   a = 100
>   change_var(locals(), 'a', 3)

Please (re)read the doc for locals():

See the big warning ?

>   print a

> But test() didn't work,

It did. The problem is elsewhere.

> the value a remains 100.
> I have several variables initialized to None.

Where ?

> I need to convert each one of them an object only if it is None.
> something like:
> if not var1: var1 = MyObject()

Warning : some objects can eval to false in a boolean context without 
being None. Better to explicitely test identity here:

if var1 is None:
     var1 = Something()

> I want this to be a function, that is:
> def create_obj(var):
>   if not var: var = MyObj()

This is a rebinding, not a mutation. Here, 'var' is a local *name*, so 
rebinding it will only affect the local namespace.

>   # set properties of var

Why don't you use the initializer of MyObj here ?

class MyObj(object):
     def __init__(self, prop1, propx):
         # set properties of self
         self.prop1 = prop1
         self.propx = propx

Then just call:

var = MyObj(somevalue, someothervalue)

> Now, I know I can achieve this by functional programming,


> def create_obj(var):
>   if not var:
>     x = MyObj()
>     # set properties of x
>     return x
>   return var

This is just a plain function. You may want to re-read the definition of 
"functional programming" !-)

> and then
> var = creaet_obj(var)
> Is there another way?

What's wrong with this one ?

More information about the Python-list mailing list