gpt4 book ai didi

python - 为什么全局关键字需要访问在外部范围内定义的变量?

转载 作者:太空宇宙 更新时间:2023-11-03 13:55:07 24 4
gpt4 key购买 nike

另一个问题没有解释为什么我不能在示例 (2) 中不使用 'global' 更改变量 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

接下来,当我注释掉带有全局关键字 (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

但为什么我可以在不使用 global (4) 的情况下更新在外部作用域中定义的列表?

list = []

def check_global_list():
list.append('check')
>> check_global_list()
>> list
<< ['check']

最佳答案

当你注释掉第2行的global time_verf语句时,

1: def check_global():
2: # global time_verf
3: clean_list = time_verf + timedelta(hours=12) # время очистки листа
4: if clean_list < datetime.now():
5: list_verf.clear()
6: time_verf = datetime.now()

第 6 行为局部变量 time_verf 赋值。它是局部的,因为分配它会将它创建为局部变量。您在第 3 行收到错误,因为它引用了您的代码在第 6 行中创建的 local 变量。如果您没有该赋值,则 time_verf 将默认为全局变量.

但是一个变量是否是全局变量并不取决于执行顺序。您似乎期望因为第 3 行本身会使 time_verf 默认成为全局变量,然后它变成全局变量并在第 6 行中保持全局变量。但这不是局部变量的工作方式。第 6 行的存在改变了第 3 行的含义(和正确性)。解释器检查函数的整个范围并为代码赋值的任何名称创建局部变量。因此,由于第 6 行,time_verf 是本地的,即使第 3 行本身会使它成为全局的。

这种行为有很好的理由。假设第 3 行包含在 if 测试中。然后,根据您似乎期望的行为,如果 if-test 为真,则该变量将是全局变量,但如果 if-test 为假,则该变量将是局部变量。

关于python - 为什么全局关键字需要访问在外部范围内定义的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57287222/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com