Python中的全局变量
我刚开始学习Python,还没学到类的部分。现在用的是Python 3.2.2。我试着把一些C语言的过程逻辑实现出来。我的代码分成了两个文件,分别是:
这个文件叫做 date.py
dd,mm,yy=0,0,0
def isValidDate(d,m,y):
if(d>=1 and d<=31 and m>=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
这个文件叫做 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()
我在代码中标记为“问题”的那些行,确实让我遇到了麻烦。
当在 module1.py
中执行这行代码("date.dd=22"
)时,date.py
中的全局变量值变成了 22
,并且保持这个值。
但是,当我调用 isValidDate()
函数时,尽管测试条件通过了,赋值似乎并没有保持。isValidDate()
函数中的打印语句显示 "dd"
被赋值了,但在 main()
函数中调用 printDate()
时却显示的是原来的值。
这是怎么回事呢?
2 个回答
5
你的 date.isValidDate 函数并不是在处理全局变量 dd、mm、yy,而是在处理一些同名的局部变量。
如果你想让 date.isValidDate 函数能够修改你想要的全局变量的值,你需要在函数的开头把这些变量声明为全局变量,像这样:
def isValidDate(d,m,y):
global dd, mm, yy
...
5
要在你的代码中给一个全局变量赋值,你需要先把它标记为全局变量。否则,代码就会把值赋给一个同名的局部变量,这样就会覆盖掉全局变量。
正如在文档中所解释的:
如果不使用global,就无法给全局变量赋值,虽然自由变量可以在不声明为全局的情况下引用全局变量。
所以,要解决这个问题,你需要像这样做:
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
...