如何在Python中更改全局变量
我正试图在程序中进一步修改一个变量。我在程序开始时声明了一个全局变量,我想在程序的不同函数中更改该变量。我可以通过再次在函数中声明变量来实现这一点,但我想知道是否有更好的方法来实现这一点。下面是一些测试代码来解释我的意思如何在Python中更改全局变量,python,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(I
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
中的新变量更改项目中的变量。使用该语句
global语句是一个声明,用于保存整个当前代码块。这意味着列出的标识符将被解释为全局标识符
例如:
附言
但是不要太频繁地使用全局
,请参见您可以在不重新分配的情况下进行变异:
variables = {}
def pro():
if variables['ID'] == '':
variables['ID'] = 'default'
当心,你做错事很多次了
即使您可以使用global语句来更改一个全局值(不鼓励这样做,因为最好使用函数参数和返回值),也不会更改其他已分配的值。例如,即使重新分配ID,也不会重新分配项目。另外:您的函数不返回任何内容,为它们的返回值指定一个名称是没有意义的,对变量使用全大写名称(ID)是一个坏习惯,因为使用它们作为常量是一种惯例
这应该让您了解global的工作方式:
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
但最好的方法是不使用globals:
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 ID
ID="Yes"
将变量分配给ID=“是”之前
但更改ID对项目变量,project=(“yes”+ID)
没有影响,因为项目已经是一个字符串
你需要做一个函数,比如
def getprojectname(ID):
return project+ID
整个程序可能是这样的
更新:
... 删除代码中的您有两个问题。第一个是关于更改ID变量,这可以通过使用全局变量来解决
第二步是代码计算项目字符串,之后项目不知道ID
为了避免代码重复,您可以将函数定义为calc项目
因此,我们:
ID = 'No'
def GetProject():
return "Yep"+ID
def pro():
global ID
ID = "YES"
print ID
print GetProject()
pro()
print GetProject()
为什么不用字典呢
>>> 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
>>>
您是否希望项目的价值也发生变化?如果是这样的话,那么你应该为它创建一个类。与问题无关,但我有点奇怪,你将局部“myObject”设置为没有返回语句的函数的返回值。这是可行的(值设置为None),但它毫无意义,是一个WTF,让人想到“他到底在想什么”。字符串在Python中是不可变的。在执行字符串连接时,就像在“项目”分配中一样,您正在创建一个新字符串。您以后无法通过更改ID的值来更改“project”。请不要将中的
放多次。请问,“预声明变量”是什么意思?Python没有声明,因此标题没有任何意义。要扩展一个次要点:project=(“Yes”+ID)
立即被计算:变量ID
被扩展为字符串'no'
,该字符串被附加到的“Yes”
,以生成字符串'YepNo'
,它立即分配给变量项目
。以后更改ID
没有任何效果,因为project
已经有了它的值。是的,我在OP帖子上直接对此进行了评论:-)这只解决了该代码的一些问题:例如,它不会改变project
在第二行被赋值并且从不更改的事实,OP希望project
在ID
更改时更新。要更改全局变量,应将其声明为全局变量。我认为此示例的代码样式非常糟糕。。。即使你回答了这个问题,你也在鼓励一个不正确的编程。是的,没错,我知道,我只是不想碰他的代码,现在就删除了。