【发布时间】:2019-12-08 18:20:40
【问题描述】:
另一个问题没有解释为什么我不能在示例 (2) 中不使用“全局”的情况下更改变量 time_verf,但仍然可以对示例 (4) 中的列表执行此操作。
On the resource我发现我无法从函数内部更改全局变量,这些示例清楚地说明了这一点:
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
接下来,当我用 global 关键字 (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)时,可以再次在没有“全局”的情况下再次引用:
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']
【问题讨论】:
-
我已经在 SO 上看到了这个答案......现在找不到问题......这个想法是,通过在名称下方的代码中添加分配行,名称“time_verf”是添加到本地(甚至在执行第一行代码之前),我将搜索带有详细信息的帖子
-
注释掉行的函数只是调用变量,它不会尝试修改。我认为这是关于可变性与不变性(列表是可变的,这就是您的底部示例有效的原因(也适用于例如字典))
-
@VladimirKolenov 我的意思是,您可以在函数内部修改可变对象,例如
list,而无需将其声明为global变量。这就是您在 (4) 中显示的内容。另一方面,像datetime这样的不可变对象,您必须将其声明为global才能在函数内部对其进行修改(或将其作为参数/关键字传递),请参见您的示例(1)-(3)。 -
@VladimirKolenov,是的,我认为 BoarGules 对此给出了很好的解释。它是关于定义变量的时间顺序(代码从上到下)。我添加了一些关于可变性的字眼,因为这可能会在脚本中引起一些混乱。
标签: python python-3.x global