如何在Python中更改全局变量

11 投票
6 回答
46181 浏览
提问于 2025-04-15 17:53

我想在程序的后面部分修改一个变量。我在程序开始时声明了一个全局变量,然后想在不同的函数中改变这个变量。我可以在函数内部重新声明这个变量,但我想知道有没有更好的方法来做到这一点。下面有一些测试代码来解释我的意思。

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)

有没有人有什么想法,谢谢

我试过使用 global 变量,但这样做的时候,项目中的变量还是打印出 YepNo,而不是 YepYES。我希望函数 pro 中的新变量能够改变 project 变量的值。

6 个回答

2

使用 global 语句。

global 语句是一种声明,它在当前代码块中有效。它的意思是,后面列出的标识符(变量名)会被当作全局变量来处理。

举个例子: http://www.rexx.com/~dkuhlman/python_101/python_101.html#SECTION004340000000000000000

附注:

不过不要太频繁地使用 global,可以参考这个视频 http://www.youtube.com/watch?v=E_kZDvwofHY#t=10m45

7

小心哦,你这样做错了好几次。

虽然你可以用 global 这个关键词来改变全局变量(不过不推荐这样做,因为用函数参数和返回值更好),但这并不会改变其他已经赋值的变量。比如说,虽然你重新给 ID 赋值,但项目(project)这个变量是不会被重新赋值的。另外,你的函数没有返回任何东西,所以给它们的返回值起个名字是没有意义的。而且,用全大写的名字(比如 ID)来命名变量是个坏习惯,因为通常全大写的名字是用来表示常量的。

这应该能让你更清楚全局变量是怎么工作的:

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

但最好的方法是不要使用全局变量:

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

这样可以让所有代码之间的互动变得清晰,也能避免与全局状态变化相关的问题。

12

要更新全局变量,你可以使用

global ID
ID="Yes"

在把变量赋值给 ID = "YES" 之前

但是,改变 ID 对项目变量是没有影响的,project = ("Yep"+ID),因为 project 已经是一个字符串了

你需要写一个像这样的函数

def getprojectname(ID):
    return project+ID

整个程序可能是这样的

更新:

... removed

撰写回答