SOME_VARIABLE = []
def some_fun:
append in SOME_VARIABLE
s = []
s = SOME_VARIABLE
SOME_VARIABLE = [] // Not setting to empty list.
return s
如何将SOME_VARIABLE
重置为空。
答案 0 :(得分:8)
如果您读取变量,Python会在整个范围链中查找它。这意味着:
GLOB_VAR = "Some string"
def some_fun():
print GLOB_VAR
将打印Some string
现在,如果你写一个变量,Python会在本地范围内查找它,如果它找不到你在本地级别给出的名字的变量,那么它会创建一个。
这意味着在您的示例中,您已在SOME_VARIABLE
函数中创建了一个名为some_fun
的变量,而不是更新全局SOME_VARIABLE
。这是一个经典的python问题。
如果要写入全局,则必须明确告诉Python您正在讨论已存在的全局变量。为此,您需要使用global
关键字。所以,以下内容:
GLOB_VAR = "Some string"
def some_fun():
global GLOB_VAR
GLOB_VAR = "Some other string"
some_fun()
print GLOB_VAR
将打印Some other string
。
注意:我认为这是鼓励人们将全局变量保持为只读,或至少考虑他们正在做什么的方式。
当您尝试先读取然后写入全局时,行为是相同的(只是更令人惊讶)。以下内容:
GLOB_VAR = False
def some_fun():
if GLOB_VAR:
GLOB_VAR = False
some_fun()
会提出:
Traceback (most recent call last):
File "t.py", line 7, in <module>
some_fun()
File "t.py", line 4, in some_fun
if GLOB_VAR:
UnboundLocalError: local variable 'GLOB_VAR' referenced before assignment
因为我们将修改GLOB_VAR
,所以它被认为是一个局部变量。
更新:Ely Bendersky有一个相关的in-depth post关于此问题,值得一读,以获取更多正式的详细信息。
答案 1 :(得分:6)
你需要告诉翻译你正在谈论一个全局变量:
def some_fun:
global SOME_VARIABLE
...
SOME_VARIABLE = []
答案 2 :(得分:2)
如果您不再需要SOME_VARIABLE,可以使用:
del SOME_VARIABLE
如果你想要一个空列表:
del SOME_VARIABLE[:]
答案 3 :(得分:0)
SOME_VARIABLE
是全局的,因此除非使用global
,否则重新绑定它不会生效。但由于它是一个可变对象,只需适当改变它。
del SOME_VARIABLE[:]