Cómo cambiar variables globales en Python

Estoy tratando de cambiar una variable más abajo en el progtwig. Tengo una variable global declarada al inicio del progtwig y quiero cambiar la variable en diferentes funciones en el progtwig. Puedo hacer esto declarando nuevamente la variable dentro de la función, pero me gustaría saber si hay una mejor manera de hacerlo A continuación se muestra un código de prueba para explicar lo que quiero decir.

ID = 'No' project = ("Yep"+ID) # ID added with 'No' value which I later want to change def pro(): ID = "YES" print ID def pro1(ID): # I could declare project again to get this to work, but I would like to avoid this print project # I want this to print with the new ID number. if __name__ == '__main__': pro() pro1(ID) 

Alguien tiene alguna idea, gracias.

He probado la variable global , pero cuando hago esto, la variable del proyecto aún imprime YepNo lugar de YepYES . Quiero que la nueva variable de la función pro cambie la variable en la variable del project .

Para actualizar variables globales puedes usar

 global ID ID="Yes" 

antes de asignar la variable a ID = “YES”

Pero el cambio de ID no tendrá efecto en la variable del proyecto, project = ("Yep"+ID) , porque el proyecto ya es una cadena

necesitas hacer una función como

 def getprojectname(ID): return project+ID 

Todo el progtwig puede ser así.

ACTUALIZACIÓN : … eliminado

Cuidado, lo estás haciendo mal varias veces.

Aunque podría usar la statement global para cambiar un global (no se recomienda, ya que es mejor usar parámetros de función y valores de retorno), eso NO cambiaría otros valores ya asignados. Por ejemplo, aunque reasigne la ID, NO reasignará el proyecto. Además: sus funciones no devuelven nada, no tiene sentido asignar un nombre a su valor de retorno, y es un hábito MALO usar un nombre en mayúscula (ID) para una variable, ya que es una convención usarlas para constantes.

Esto debería aclararte la forma en que funciona global:

 myid = '' project = ("Yep"+myid) #ID added with no value which I later want to change def mutate_id(): global myid myid = "YES" def mutate_project(): global project project = ("YEP" + myid) if __name__ == '__main__': print "myid", myid print "project ", project print mutate_id() print "myid", myid print "project ", project print mutate_project() print "myid", myid print "project ", project print 

Pero la mejor manera es hacer SIN globals:

 def get_new_id(old): return "YES" def get_new_project(old): return ("YEP" + myid) if __name__ == '__main__': myid = '' project = ("Yep"+myid) print "myid", myid print "project ", project print myid = get_new_id(myid) print "myid", myid print "project ", project print project = get_new_project(project) print "myid", myid print "project ", project print 

Esto hará que toda la interacción del código sea clara y evitará problemas relacionados con el cambio de estado global.

Utilice la statement global .

La statement global es una statement que se mantiene para todo el bloque de código actual. Esto significa que los identificadores enumerados deben interpretarse como globales.

Ejemplo: http://www.rexx.com/~dkuhlman/python_101/python_101.html#SECTION004340000000000000000

PD

Pero no utilices global uso global demasiada frecuencia, consulta http://www.youtube.com/watch?v=E_kZDvwofHY#t=10m45

En tu código tienes dos problemas. El primero sobre el cambio de la variable ID, que podría resolverse mediante el uso de global.

Lo segundo que su código calcula la cadena del proyecto y después de ese proyecto no se conoce la ID.

Para evitar la duplicación de código, puede definir la función a proyecto de cálculo.

Entonces tenemos:

 ID = 'No' def GetProject(): return "Yep"+ID def pro(): global ID ID = "YES" print ID print GetProject() pro() print GetProject() 

¿Por qué no usar un diccionario?

 >>> attr = {'start':'XXX', 'myid':'No'} >>> >>> def update_and_show(D, value = None): ... if value: D['myid'] = value ... print D['start'] + ' ' + D['myid'] ... >>> update_and_show(attr) XXX No >>> update_and_show(attr, 'Yes') XXX Yes >>> update_and_show(attr, 'No') XXX No >>> 

Puedes mutar sin reasignar:

 variables = {} def pro(): if variables['ID'] == '': variables['ID'] = 'default'