UnboundLocalError in python confusing
有人能解释一下下面的例外代码吗?仅当我将display()中的var sub更改为其他名称时,它才起作用。也没有全局变量Sub。那发生了什么?
1 2 3 4 5 6 | def sub(a, b): return a - b def display(): sub = sub(2,1) // if change to sub1 or sth different to sub, it works print sub |
您在作用域内分配给的任何变量都被视为局部变量(除非您声明为
具有相同错误的简化示例:
1 2 3 | def a(): pass def b(): a = a() |
现在,考虑这里涉及的不同范围:
全局命名空间包含
函数
函数
1 | def b(): x = x() |
解决方法很简单:为
重要的是要注意,使用和分配的顺序没有区别-如果您这样编写函数,错误仍然会发生:
1 2 3 4 | def display(): value = sub(2,1) #UnboundLocalError here... print value sub ="someOtherValue" #because you assign a variable named `sub` here |
这是因为局部变量列表是在Python解释器创建函数对象时生成的。
对于使用的每个变量,python都确定它是局部变量还是非局部变量。引用未知变量将其标记为非局部变量。稍后重用与局部变量相同的名称被认为是程序员的错误。
考虑这个例子:
1 2 3 4 | def err(): print x # this line references x x = 3 # this line creates a local variable x err() |
这给了你
1 2 3 4 5 6 | Traceback (most recent call last): File"asd.py", line 5, in <module> err() File"asd.py", line 2, in err print x # this line references x UnboundLocalError: local variable 'x' referenced before assignment |
实际上,python跟踪代码中所有对名称的引用。当它读取行
这最初是一个评论。OP发现这是一个有用的答案。因此,我重新发布它作为答案
最初,
编辑:
首先定义一个函数
当您创建一个变量并试图分配给它时(比如
因此,如果您的声明是
但是假设
python开始执行代码并首先获取函数
1 2 | def sub(a, b): return a - b |
所以在执行这个解释器之后,将
1 2 3 | def display(): sub = sub(2,1) // if change to sub1 or sth different to sub, it works print sub |
所以第一行