如何在不更改全局变量的情况下更改分配给全局值的局部变量?
问题描述:
所以这基本上是我使用的代码的工作原理。如何在不更改全局变量的情况下更改分配给全局值的局部变量?
global Gvar
Gvar = ["Hello"]
def someFunction():
Lvar = Gvar
Lvar.append("World")
print(Lvar)
print(Gvar)
someFunction()
这会输出两次“Hello World”。当我更改本地时,如何防止全局变量的更改?
在此先感谢,希望有人能帮助我。
答
这里的问题是以下行:
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)
。
将该列表分配给本地变量时复制该列表。 – Barmar
您可能想了解Python变量和赋值如何工作:https://nedbatchelder.com/text/names.html – user2357112
哇快速回复。我认为这会帮助我。非常感谢 :) –