如何在Python中更改全局变量

时间:2010-01-11 09:53:12

标签: python

我正在尝试在程序中进一步更改变量。我在程序开始时声明了一个全局变量,我想在程序中更改不同函数中的变量。我可以通过再次声明函数内部的变量来做到这一点,但我想知道是否有更好的方法来做到这一点。下面是一些测试代码来解释我的意思。

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 个答案:

答案 0 :(得分:6)

小心,你多次做错了。

即使您可以使用全局语句来更改全局(由于最好使用函数参数和返回值,因此不建议这样做),这不会更改其他已分配的值。例如。即使您重新分配ID,也不会重新分配项目。另外:你的函数什么也没有返回,给它们的返回值赋一个名字是没有意义的,而且这是一个使用变量的全大写名称(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

这将使所有代码交互清晰,并防止与全局状态更改相关的问题。

答案 1 :(得分:6)

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

global ID
ID="Yes"

在将变量分配给ID =“YES”之前

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

你需要制作像

这样的功能
def getprojectname(ID):
    return project+ID

整个程序可能就像这样

<强>更新: ......删除

答案 2 :(得分:2)

使用global声明。

  

全局语句是一个声明,它包含整个当前代码块。这意味着列出的标识符将被解释为全局变量。

示例:http://www.rexx.com/~dkuhlman/python_101/python_101.html#SECTION004340000000000000000

P.S。

但请不要经常使用global,请参阅http://www.youtube.com/watch?v=E_kZDvwofHY#t=10m45

答案 3 :(得分:1)

在您的代码中,您有两个问题。第一个关于改变ID变量,可以通过使用全局来解决。

第二个代码计算项目字符串,在该项目之后不知道ID。

为避免代码重复,您可以将函数定义为calc项目。

所以我们有:

ID = 'No'
def GetProject():
    return "Yep"+ID

def pro():
   global ID
   ID = "YES"
   print ID

print GetProject()

pro()

print GetProject()

答案 4 :(得分:0)

为什么不使用字典?

>>> attr = {'start':'XXX', 'myid':'No'}
>>> 
>>> def update_and_show(D, value = None):
...     if value:  D['myid'] = value
...     print D['start'] + ' ' + D['myid']
... 
>>> update_and_show(attr)
XXX No
>>> update_and_show(attr, 'Yes')
XXX Yes
>>> update_and_show(attr, 'No')
XXX No
>>>

答案 5 :(得分:-1)

你可以在不重新分配的情况下进行变异:

variables = {}
def pro():
    if variables['ID'] == '':
        variables['ID'] = 'default'