如何在不更改全局变量的情况下更改分配给全局变量值的局部变量?

时间:2017-08-10 20:12:56

标签: python global-variables python-2.x local-variables

所以这基本上就是我使用的代码的工作方式。

global Gvar
Gvar = ["Hello"]

def someFunction():
    Lvar = Gvar
    Lvar.append("World")
    print(Lvar)
    print(Gvar)

someFunction()

这输出" Hello World"两次。当我更改本地时,如何防止更改全局变量?

提前致谢,我希望有人可以帮助我。

2 个答案:

答案 0 :(得分:0)

这里的问题是以下几行:

Lvar = Gvar

由于Gvar是一个列表,因此是一个复杂的数据类型,因此Python不会复制该值,而是引用该变量。因此,无论您修改Lvar还是Gvar,都不会产生任何影响。相反,您可能希望以不同的方式复制可以实现的值,例如:

Lvar = Gvar[:]

或者,您可以使用copy module。有关详细信息,请查看Python FAQs

完成后,修改后的代码将如下所示:

global Gvar
Gvar = ["Hello"]

def someFunction():
    Lvar = Gvar[:]
    Lvar.append("World")
    print(Lvar)
    print(Gvar)

someFunction()

作为旁注,Python中的变量名称应该是小写的 - 大写通常仅用于类定义。

答案 1 :(得分:0)

您可以使用shallow copy执行htis任务:

global Gvar
Gvar = ["Hello"]

def someFunction():
    Lvar = Gvar.copy()

    Lvar.append("World")
    print(Lvar)
    print(Gvar)

someFunction()

输出:

['Hello', 'World']
['Hello']

您还可以使用deepcopy执行此任务:

import copy
global Gvar
Gvar = ["Hello"]

def someFunction():
    Lvar = copy.deepcopy(Gvar)
    Lvar.append("World")
    print(Lvar)
    print(Gvar)

someFunction()

输出:

['Hello', 'World']
['Hello']

NB:如果您使用Python 2.7.6,请使用print Lvar代替print(Lvar)print Gvar代替print(Gvar)