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