Python中的全局变量

3 投票
2 回答
4964 浏览
提问于 2025-04-17 10:22

我刚开始学习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
        ...

撰写回答