Bala subramanian wrote:
Friends,
I want to define a function that can populate an array by taking its name
(which is defined globally). I defined two empty arrays as follows and a
function that can populate the array.

In general it is tricky to resize and populate numpy arrays in place. It is usually better to just create a fresh array and reassign it. Something like this should probably work:

def ref(length):
    arr = np.zeros((length, 3), dtype='float32')
    for i in range(length):
        for j in range(3):
            arr[i, j] = resid[Index[i]].cent()[j]
    return arr


ref_f1 = ref(3)
ref_f2 = ref(5)


should work for you. (I can't test it because you don't say what resid and Index are.)



To explain why your earlier code does not work the way you expect, read on:


REF_F1=np.array([])
REF_F2=np.array([])

# populating the given array
def ref(ln,REF_F1):

So far this is good -- your function takes an argument called "REF_F1", which can be any array you like. It's just a local name.

The function sees REF_F1 is a local variable.


    global REF_F1

But this is no good, because now you declare the name REF_F1 to be global instead of local. So now the function sees REF_F1 as a global variable, and everything that you do to it, occurs to the global called REF_F1.

By the way, this bug is no longer permitted in the latest version of Python. Using Python 3.2:

py> x = 23
py> def func(x):
...     global x
...     print("x =", x)
...
  File "<stdin>", line 1
SyntaxError: name 'x' is parameter and global


In general, if you feel the need to use "global", 90% of the time you are doing something wrong and will have problems. You should avoid using global unless absolutely necessary.



--
Steven
_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to