Python “收到”;UnboundLocalError:局部变量';e';作业前参考“;初始化变量时
[社区编辑以提供可复制的示例:Python “收到”;UnboundLocalError:局部变量';e';作业前参考“;初始化变量时,python,exception,exception-handling,python-3.x,while-loop,Python,Exception,Exception Handling,Python 3.x,While Loop,[社区编辑以提供可复制的示例: def main(): e = None print(locals()) while not e: try: raise Exception except Exception as e: pass main() 产生 ~/coding$ python3.3 quiz2.py {'e': None} Traceback (most re
def main():
e = None
print(locals())
while not e:
try:
raise Exception
except Exception as e:
pass
main()
产生
~/coding$ python3.3 quiz2.py
{'e': None}
Traceback (most recent call last):
File "quiz2.py", line 11, in <module>
main()
File "quiz2.py", line 5, in main
while not e:
UnboundLocalError: local variable 'e' referenced before assignment
完整的代码如下:https://www.dropbox.com/s/llj5xwexzfsoppv/stats_quiz_feb24_2013.py
它所需的数据文件(用于运行测验)位于以下链接中:https://www.dropbox.com/s/70pbcb80kss2k9e/stats_quiz.dat
main()
需要编辑才能使用正确的数据文件地址:
下面是我收到的完整错误消息。这很奇怪,因为我在while循环之前初始化了e
。我希望有人能帮我解决这个问题。谢谢
Traceback (most recent call last):
File "<pyshell#217>", line 1, in <module>
main()
File "/Users/Dropbox/folder/stats_quiz_feb24_2013.py", line 83, in main
while not e:
UnboundLocalError: local variable 'e' referenced before assignment
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
main()
文件“/Users/Dropbox/folder/stats\u quick\u feb24\u 2013.py”,第83行,主文件
虽然不是e:
UnboundLocalError:赋值前引用了局部变量“e”
嗯,我不知道是什么导致了实际的问题,但是当出现异常时,为什么不直接使用break
?您的循环变成:
while True:
try:
score = pickle.load(score_list)
name = pickle.load(score_list)
score_name.append([score, name])
except EOFError as e:
break
据我所知,这是实现“无例外运行循环”的惯用方法
编辑:为什么会发生这种情况
在python3中,一旦退出异常处理程序的作用域,异常绑定到的变量就会从名称空间中删除。我将代码修改为以下内容:
def main():
e = None
print(locals())
while not e:
try:
raise Exception
except Exception as e:
pass
print(locals())
main()
输出:
{'e': None}
{}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in main
UnboundLocalError: local variable 'e' referenced before assignment
将生成以下输出:
{'e': None}
{'e': Exception()}
但是您确实不应该为您的特定用例这样做。此错误是由新的
try…引起的,除了…
scope,它是Python 3的一个特性。看 在Python3中,以下代码块
try:
try_body
except E as N:
except_body
...
转换为(用Python 2.5术语)
因此,在Python3中,这个函数
def main():
e = None
print(locals())
while not e:
try:
raise Exception
except Exception as e:
pass
相当于
def main():
e = None
print(locals())
if not e:
try:
raise Exception
except Exception as e:
pass
del e
if not e:
try:
raise Exception
except Exception as e:
pass
del e
...
e
已初始化,但在第一个块之后,它已被删除
因此,UnboundLocalError
是不允许的。放在一边:行score\u name=score=name=[]
可能不会像您认为的那样。它不制作三个列表,而是制作一个列表,并绑定三个名称。在控制台尝试,然后score.append(3);打印(分数、分数、名称)
。这在这里可能并不重要,因为你重新绑定了分数
和名称
,但仍然如此。呃,我完全忘记了引用的问题(来自R,它没有这个问题)。谢谢你指出这一点!无法复制。请提供一个最小的自包含的示例。我不知道如何复制它-代码中一定有我们看不到的东西。您是否可以尝试制作一个可复制的示例,即可以运行并产生此错误的代码的简短版本?(很可能在这样做的过程中,您首先会发现问题的原因)。完整的代码对我来说很有用。请提供一个最小的失败代码,而不是这个怪物。谢谢你的简单解决方案和解释!考虑到我使用python3的经验有限,Nymk的回答比我的解释更好地解释了为什么会发生这种情况。如果你有时间阅读的话,他链接到的PEP特别具有指导意义:)我没有太多地使用python3(我现在仍然停留在python2的老方法中)。谢谢你的解释:)我猜问题的语义从python2变为python3,但我不知道到底是怎么回事。谢谢你的解释!我刚开始使用Python,我的朋友告诉我3和2之间有很多不方便的区别。(我的朋友们只使用python 2)
try:
try_body
except E, N:
try:
except_body
finally:
N = None
del N
...
def main():
e = None
print(locals())
while not e:
try:
raise Exception
except Exception as e:
pass
def main():
e = None
print(locals())
if not e:
try:
raise Exception
except Exception as e:
pass
del e
if not e:
try:
raise Exception
except Exception as e:
pass
del e
...