Python中的全局变量

Jaz*_*azz 3 python global-variables python-3.x

我是Python的新手.尚未学过的课程.使用Python 3.2.2.尝试实现一些程序C逻辑.我的代码分布在2个文件中,如下所示.

这个文件叫做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
Run Code Online (Sandbox Code Playgroud)

这个文件叫做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()
Run Code Online (Sandbox Code Playgroud)

我评论为"问题"的线条给我带来了问题.

module1.py(即"date.dd=22")中的语句执行时,全局变量的值date.py将更改为22并保持该方式.

但是当我调用该isValidDate()函数时,即使测试条件通过,分配似乎也不是永久性的.isValidDate()函数中的本地print语句显示"dd"赋值,但在main()函数中,调用printDate()显示原始值.

到底是怎么回事?

jco*_*ado 5

要为代码中的全局变量赋值,您必须将其标记为原样,否则代码将分配给具有相同名称的本地变量(实际上会影响全局变量).

文档中所述:

没有全局变量就不可能分配给全局变量,尽管自由变量可以引用全局变量而不被声明为全局变量.

因此,要解决问题,你需要这样的东西:

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
        ...
Run Code Online (Sandbox Code Playgroud)


jsb*_*eno 5

你的date.isValidDate函数不对global变量dd,mm,yy进行操作 - 而是对具有相同名称的(函数)局部变量进行操作.

为了让date.isValidDate更改所需变量的(模块)全局值,您必须在函数顶部将它们声明为全局 - 如下所示:

def isValidDate(d,m,y):
    global dd, mm, yy
    ...
Run Code Online (Sandbox Code Playgroud)