Variable global en Python

Soy muy nuevo en Python. Aún no aprendí clases. Utilizando Python 3.2.2. Intenté implementar alguna lógica C de procedimiento. Mi código se extiende sobre 2 archivos de la siguiente manera.

este archivo se llama date.py

dd,mm,yy=0,0,0 def isValidDate(d,m,y): if(d>=1 and d=1 and m<=12): dd,mm,yy=d,m,y #problem print(dd,mm,yy) #problem print(d,m,y) #problem return True else: return False def printDate(): print(dd,mm,yy) #problem 

este archivo se llama module1.py

 import date def main(): dd,mm,yy = 23,1,1984 valid = date.isValidDate(dd,mm,yy) #problem print (valid) date.printDate() date.dd=22 #problem date.printDate() if __name__ == '__main__': main() 

Las líneas que he comentado como “problema” me están dando problemas.

Cuando se module1.py la instrucción en module1.py (que es "date.dd=22" ), el valor de la variable global en date.py cambia a 22 y se mantiene así.

Pero cuando llamo a la función isValidDate() , a pesar de que se pasa la condición de prueba, la asignación no parece ser permanente. La statement de impresión local en la función isValidDate() muestra que a "dd" se le asigna el valor, pero en la función main() la llamada a printDate() muestra los valores originales.

Que esta pasando?

Para asignar valores a una variable global en su código, debe marcarlo como tal, de lo contrario, el código se asignaría a una variable local con el mismo nombre (lo que en realidad sería sombrear la variable global).

Como se explica en la documentación :

Sería imposible asignarlo a una variable global sin global, aunque las variables libres pueden referirse a globales sin ser declaradas globales.

Por lo tanto, para solucionar el problema, necesitarías algo como esto:

 def isValidDate(d,m,y): if(d>=1 and d<=31 and m>=1 and m<=12): global dd, mm, yy dd,mm,yy=d,m,y ... 

Su función date.isValidDate no opera en las variables global dd, mm, yy, sino que opera en variables locales (función) con los mismos nombres.

Para que date.isValidDate cambie los valores globales (módulo) de las variables que desea, debe declararlos como globales en la parte superior de la función, como esto:

 def isValidDate(d,m,y): global dd, mm, yy ...