Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中更改全局变量_Python - Fatal编程技术网

如何在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
更改时更新。要更改全局变量,应将其声明为全局变量。我认为此示例的代码样式非常糟糕。。。即使你回答了这个问题,你也在鼓励一个不正确的编程。是的,没错,我知道,我只是不想碰他的代码,现在就删除了。