Question

New to sage and python, so I'm not sure which I'm abusing. I'm trying to define the following function which acts on the input list A, but every time I input the function affects the global value of A. How can I make it behave locally?

def listxgcd( A ):
    g,s,t=xgcd(A.pop(0),A.pop(0))
    coeffs=[s,t]
    while a!=[]:
        g,s,t=xgcd(g,A.pop(0))
        coeffs=[s*i for i in coeffs]
        coeffs=coeffs+[t]
    return coeffs

I've tried setting B=A and substituting B everywhere but this doesn't work either which I don't understand. Do I need to declare some sort of sage-y variable thing?

def listxgcd( a ):
    B=a
    g,s,t=xgcd(B.pop(0),B.pop(0))
    coeffs=[s,t]
    while B!=[]:
        g,s,t=xgcd(g,B.pop(0))
        coeffs=[s*i for i in coeffs]
        coeffs=coeffs+[t]
    return coeffs

Much thanks!

Was it helpful?

Solution

You are passing a reference to a container object to your listxgcd function and the function retrieves elements from that container using pop. This is not a scope issue, simply the fact there you are operating directly on the container you have passed to the function.

If you don't want the function to modify the container, make a copy of it:

import copy
def listxgcd( Ain ):
    A = copy(Ain)
    ...

Or better, access the elements using indexing, if the container allows it:

...
g,s,t=xgcd(A[0],A[1])
...
for i in range(2,len(A)):
    g,s,t=xgcd(g,A[i])
    ...
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top