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

问题描述:

所以这基本上是我使用的代码的工作原理。如何在不更改全局变量的情况下更改分配给全局值的局部变量?

global Gvar 
Gvar = ["Hello"] 

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

someFunction() 

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

在此先感谢,希望有人能帮助我。

+0

将该列表分配给本地变量时复制该列表。 – Barmar

+0

您可能想了解Python变量和赋值如何工作:https://nedbatchelder.com/text/names.html – user2357112

+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变量名应该是小写 - 大写通常用于类定义只要。

您可以使用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'] 

N.B:如果你使用Python 2.7.6然后使用print Lvar代替print(Lvar)print Gvar而不是print(Gvar)