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) |
有什么主意吗,谢谢
我试过
要更新全局变量,可以使用
1 2 | global ID ID="Yes" |
在将变量赋给id="yes"之前
但是更改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 mutate_id() print"myid", myid print"project", project mutate_project() print"myid", myid print"project", project |
但最好的办法是不使用全球数据:
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 myid = get_new_id(myid) print"myid", myid print"project", project project = get_new_project(project) print"myid", myid print"project", project |
这将使所有代码交互变得清晰,并防止与全局状态更改相关的问题。
使用
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
附笔。
但不要太频繁地使用
在代码中,有两个问题。第一个关于改变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' |