2010-12-23 21 views
11

he definido la siguiente función:Modificación de una variable global dentro de una función

def GMM(s1, s2, s3, s4, s5, a): 
    """The GMM objective function. 

    Arguments 
    --------- 
     si: float 
      standard deviations of preference distribution 

     a: float 
      marginal utility of residutal income 

    Paramters 
    --------- 
     Px: array (1,ns) 
      projector onto nonprice characteristic space 

     xk, z: arrays (J, 5) and (J, 12) 
      nonprice char. and instruments 

     invW: array (12, 12) 
      GMM weight matrix 

    Returns 
    ------- 
     float.""" 
    delta = invert(s1, s2, s3, s4, s5, a, delta0) # Invert market shares to get mean utility 
    bmean = np.dot(Px, delta)      # Project delta onto charancteristic space 
    xihat = delta - np.dot(xk, bmean)    # Compute implied unobservable prod. quality 
    temp1 = np.dot(xihat.T, z) 
    if np.any(np.isnan(delta)) == True: 
     value = 1e+10 
    else: 
     value = np.dot(np.dot(temp1, invW), temp1.T) 
    return np.sqrt(value) 

Mi pregunta se refiere a la variable delta con destino dentro de la función. Fuera de la función, estableceré el valor inicial de delta0. Ahora, en última instancia, minimizaré esta función. Lo que me gustaría que sucediera es que cada vez que se evalúa la función GMM, delta de la evaluación anterior se usa como el nuevo delta0. Traté de definir delta0 como una variable global, pero no pareció funcionar ... probablemente este fue mi error. Aunque, he leído aquí que generalmente este es un mal enfoque. ¿Alguna sugerencia?

Respuesta

12
globalVariable = 0 

def test(): 
    global globalVariable 
    globalVariable = 10 

test() 
print globalVariable 

Puede editar una variable global de esta manera.

+1

+1. Hubiera sido mejor haber formulado el código de ejemplo en términos de GMM, delta y delta0 –

24

Existen múltiples formas de lograr lo que desea. delta se guarda a través de llamadas a funciones en los siguientes ejemplos.

1- Clase

class Example: 
    def __init__(self, value): 
    self.delta = value 
    def gmm(self): 
    self.delta += 1 
    return self.delta 

e = Example(0) 
print e.gmm() 

2- Generador

def gmm(): 
    delta = 0 
    while True: 
    delta += 1 
    yield delta 

for v in gmm(): 
    print v 

3- atributo Función

def gmm(): 
    gmm.delta += 1 
    return delta 
gmm.delta = 0 

4- Variable global (desalentado como usted ha dicho):

delta = 0 
def gmm(): 
    global delta 
    delta += 1 
    return delta 

etc ...

+1

Esto es perfecto. Gracias. –

4

Cuando me enfrento a esto, un kludge común que uso es meter un objeto en un módulo, que luego lo pone en un espacio de nombres accesible por todo en el programa. Es un gran desafío, pero me parece que elimina cualquier ambigüedad sobre lo que es global. Para la materia independiente puse en os, si se trata de un proyecto completo en general, voy a crear un archivo vacío llamado pitón my_globals y de importación, es decir

import my_globals 
my_globals.thing = "rawp" 
def func(): 
    my_globals.thing = "test" 
func() 
print my_globals.thing # "test" 
Cuestiones relacionadas