另一个问题没有解释为什么我不能在例子(2)中不使用 'global' 改变变量 time_verf,但仍然可以在例子(4)中改变列表。
我在这个资源上发现,我不能从函数内部更改全局变量,这些示例清楚地说明了这一点。
我在这个资源上发现,我不能从函数内部更改全局变量,这些示例清楚地说明了这一点。
from datetime import datetime, timedelta
time_verf = datetime.now()
我认为我明白为什么以下内容(1)是有效的:
def check_global():
global time_verf
clean_list = time_verf + timedelta(hours=12) # время очистки листа
if clean_list < datetime.now():
list_verf.clear()
time_verf = datetime.now()
print('ok')
>> check_global()
<< ok
当我注释掉带有全局关键字的行(2)时,它会抛出异常:
def check_global():
# global time_verf
clean_list = time_verf + timedelta(hours=12) # время очистки листа
if clean_list < datetime.now():
list_verf.clear()
time_verf = datetime.now()
print('ok')
>> check_global()
<< Traceback (most recent call last):
File "<input>", line 1, in <module>
File "<input>", line 3, in check_global
UnboundLocalError: local variable 'time_verf' referenced before assignment
当使用赋值语句注释掉(3)行时,再次引用该变量时可以不使用 'global' 关键字:
def check_global():
# global time_verf
clean_list = time_verf + timedelta(hours=12) # время очистки листа
if clean_list < datetime.now():
list_verf.clear()
# time_verf = datetime.now()
print('ok')
>> check_global()
<< ok
但是为什么我可以更新在外部作用域中定义的列表而不使用全局变量 (4) 呢?
list = []
def check_global_list():
list.append('check')
>> check_global_list()
>> list
<< ['check']
list
)而不必声明它为全局变量,这就是你在(4)中展示的内容。另一方面,对于不可变对象(例如datetime
),你必须将其声明为全局变量才能在函数内进行修改(或作为参数/关键字传递),请参见你的示例(1)-(3)。 - FObersteiner