【发布时间】:2021-06-01 20:36:18
【问题描述】:
我在 python3.8 脚本中遇到了一种情况,在从外部文件导入一堆变量后,在某些函数中可以正常访问它们,而在其他函数中则不能。例如。在文件tm_constants.py 中定义了一个常量min_time_n_clicks,并带有一个简单的声明,
min_time_n_clicks=10
请原谅这不是一个可重复的示例,因为完整的代码很长,它试图展示我所遇到的:在一个函数函数 check_scope 我可以使用 from tm_constants import * 访问变量,而另一个函数check_for_limiting 看不到它们 - 它命中了
UnboundLocalError: local variable 'min_time_n_clicks' referenced before assignment
为什么会这样?我从不使用 del 等删除变量,在我使用的 pycharm 调试器中,即使在有问题的函数范围内,也可以看到和评估有问题的变量 (min_time_n_clicks)。使用点符号访问是否是首选方法,如果是,为什么?
from tm_constants import *
import tm_constants
def check_scope():
print(f'ok: {min_time_n_clicks}')
print(f'ok: {tm_constants.min_time_n_clicks}')
def check_for_limiting():
print(tm_constants.min_time_n_clicks)
tm_constants.min_time_n_clicks = 0 # ok
print(min_time_n_clicks)
min_time_n_clicks = 0 # not ok !!!
【问题讨论】:
-
我看不出问题出在哪里,如果没有对模块
tm_constants的最小定义,我无法重现该问题。 -
我不知道你是如何得到一个
UnboundLocalError而没有分配给函数中的名称的。 -
如果
tm_constants.py和tmp.py定义如图所示(加上调用check_scope()和check_for_limiting(None)),python3 tmp.py不会产生UnboundLocalError。 -
@chepner 是的,我过度编辑了我的函数,原版。有一些任务。代码太长,我无法完整添加,并不意味着是可重现的示例
-
仍然没有错误。但是,如果您尝试在赋值之前打印 global
min_time_n_clicks的值,则会收到错误消息。 presense 将名称标记为本地的分配,而不是运行时的实际分配。也就是说,不能在同一个作用域内使用同名的全局和局部。
标签: python import global python-3.8