如何在python中更改全局变量

How to change global variables in Python

本问题已经有最佳答案,请猛点这里访问。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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变量中的变量。


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

1
2
global ID
ID="Yes"

在将变量赋给id="yes"之前

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

你需要做一个像

1
2
def getprojectname(ID):
    return project+ID

整个程序可能是这样的

更新:…远离的


当心,你做错了很多次。

即使可以使用global语句来更改全局(不鼓励这样做,因为最好使用函数参数和返回值),也不会更改其他已分配的值。例如,即使您重新分配ID,也不会重新分配项目。另外:函数什么也不返回,为其返回值指定一个名称没有意义,而且对变量使用全大写名称(ID)是一个坏习惯,因为使用它们作为常量是一种惯例。

这应该让您清楚全球的工作方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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

但最好的办法是不使用全球数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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

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


使用global语句。

The global statement is a declaration which holds for the entire current code block. It means that the listed identifiers are to be interpreted as globals.

示例:http://www.rexx.com/~dkuhlman/python_101/python_101.html section 0043400000000000000000000

附笔。

但不要太频繁地使用global,参见http://www.youtube.com/watch?V=E_kzdvwofhy t=10m45


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

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

为了避免代码重复,可以定义函数来计算项目。

所以我们有:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ID = 'No'
def GetProject():
    return"Yep"+ID

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

print GetProject()

pro()

print GetProject()

为什么不用字典呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> 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
>>>

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

1
2
3
4
variables = {}
def pro():
    if variables['ID'] == '':
        variables['ID'] = 'default'