2010-01-11 50 views
2

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

有任何人任何想法,

我已经尝试了“全局”变量感谢,但我这样做时,该项目的变量还是打印出“YepNo”而不是“YepYES”。我希望函数'pro'中的新变量改变'project'变量中的变量。

+0

你想让项目的价值改变吗?如果是这样的话,那么你应该为它做一个课。 – 2010-01-11 10:07:41

+3

与这个问题没有关系,但是我通过将本地“myObject”设置为没有返回语句的函数的返回值来确定。这有效(价值设置为无),但它是没有意义的,是一个WTF,让人想到“他到底在想什么”。 – ddaa 2010-01-11 10:12:13

+2

字符串在Python中是不可变的。在执行字符串连接时,如在“项目”分配中,您正在创建一个新字符串。您以后无法通过更改ID的值来更改“项目”。 – 2010-01-11 10:13:16

回答

4

要更新全局变量,你可以到ID分配变量之前使用

global ID 
ID="Yes" 

=“YES”

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

你需要做一个函数喜欢

def getprojectname(ID): 
    return project+ID 

整个程序可能是这样

UPDATE: ...删除

+0

要更改全局变量,应该声明为全局变量。 – 2010-01-11 10:43:51

+2

我认为这个例子的代码风格非常糟糕......即使你回答了这个问题,你也鼓励了一个不适当的编程。 – 2010-01-11 11:41:48

+1

是的,这是正确的,我知道,我只是不想触摸他的代码,现在删除。 – YOU 2010-01-11 11:47:51

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

+0

这只能解决这个代码中的一些问题:例如,它并没有改变“项目”在第二行被分配了它的值并且从不改变的事实,并且OP想要的是“项目'在ID变化时更新。 – 2010-01-11 10:20:38

-1

你可以不发生突变重新分配:

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

当心,你错了多次这样做。

即使您可以使用全局语句来更改全局(由于最好使用函数参数和返回值,所以不鼓励使用),但它不会更改其他已分配的值。例如。即使您重新分配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 

这将使所有代码互动清楚,防止相关问题全球状态变化。

+0

为了扩展一个小点:立即计算'project =(“Yep”+ ID)':将变量'ID'扩展为字符串''No'',并附加到'“Yes”字符串“YepNo”,它立即分配给变量“project”。稍后更改'ID'不会产生任何效果,因为'project'已经有了它的价值。 – 2010-01-11 10:18:46

+0

是的,我直接在OP上发表评论:-) – 2010-01-11 11:39:24

1

在你的代码有两个问题。首先关于改变ID变量,这可以通过使用全局来解决。

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

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

因此,我们有:

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

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

print GetProject() 

pro() 

print GetProject() 
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 
>>>