[pythran] Re: Pass By Reference For Module Level Variables

  • From: Serge Guelton <serge.guelton@xxxxxxxxxxxxxxxxxxx>
  • To: pythran@xxxxxxxxxxxxx
  • Date: Fri, 5 Apr 2019 11:30:09 +0200

Hi Alex,

On Thu, Apr 04, 2019 at 05:41:38PM -0700, Alex Zhang wrote:

Sorry, I don't know why my first email's format got so messed up. I am
reformatting below:

Hey Serge & Everybody,

First of all, Pythran has been extremely helpful to my projects at work. I am
very grateful.

In my limited understanding, typically pythran’s functions take arguments by
value. But with numpy arrays, it is by reference. However, I am struggling 
with


Your understanding is correct!

how to make it work for module-level variables. Let’s take a look at the 
simple
example below (saved as test.py):


# pythran export add_np_array(float[:])
# pythran export add_np_array_internal()
# pythran export get_vv()

import numpy as np

def add_np_array(v):

    res = np.sum(v)
    v[0] = v[0] + 10
    return res

vv = np.array([0.0, 0.0, 0.0])

def add_np_array_internal():

    add_np_array(vv)
    add_np_array(vv)
    return vv

def get_vv():
    return vv
 

After compiling and import test in python, I can run the code below:


import numpy as np
import test
x = np.array([0.0, 0.0, 0.0])
test.add_np_array(x)
0.0

test.add_np_array(x)
10.0

x
array([20.,  0.,  0.]) #So far this is expected.

test.get_vv()
array([0., 0., 0.])

test.add_np_array_internal() #this is very puzzling to me.
array([0., 0., 0.])

test.get_vv()
array([0., 0., 0.])

 
It is very puzzling to me why the call to add_np_array_internal return [0, 0,
0]. Even if add_np_array_internal is working a local copy of vv, shouldn’t it
pass by reference to add_np_array?

Hope you can help me understand. Also, is it possible to let vv used by
reference (in other words, in the last call of test.get_vv(), I get a modified
value)?

As of now, pythran modules are stateless. It means that global variables are
actually constants, regenerated- on the need.

This is a very confusing design choice. Would you mind opening an issue so that
I don't loose track of it? Thanks

Other related posts: