Pass by reference

Bruno Desthuilliers bruno.42.desthuilliers at websiteburo.invalid
Wed Dec 31 12:59:18 CET 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():
http://www.python.org/doc/2.6/library/functions.html#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