关注我们的python reference manual
如果根本找不到名称,则会引发NameError异常。如果 名称是指尚未绑定的局部变量,a 引发UnboundLocalError异常。 UnboundLocalError是一个子类 NameError。
我不承诺UnboundLocalError
何时造成?因为
Python缺少声明并允许进行名称绑定操作 代码块中的任何位置。
那么我们如何声明一个变量,而不是初始化她?
答案 0 :(得分:0)
您可以将引用到某个名称而不必分配给它:
>>> foobar
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'foobar' is not defined
这里引用foobar
,但从未分配过。{1}}。这会引发NameError
,因为名称从未绑定过。
更巧妙的是,这里的分配没有发生,因为执行的行永远不会运行:
>>> def foo():
... if False:
... spam = 'eggs'
... print spam
...
>>> foo()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in foo
UnboundLocalError: local variable 'spam' referenced before assignment
由于永远不会执行spam = 'eggs'
,print spam
会引发UnboudLocalError
。
请注意,Python中没有任何名称声明。你绑定或不绑定,声明不是语言的一部分。
相反,绑定用于确定名称的范围;绑定操作包括赋值,用于for
循环的名称,函数参数,import语句,用于在except
子句中保存捕获的异常的名称,with
中的上下文管理器的名称声明所有绑定名称。
如果名称绑定在作用域中(例如在函数中),那么它是本地名称,除非您使用global
语句(或Python 3中的nonlocal
语句)来明确将名称标记为全局(或闭包)。
以下是错误:
>>> foo = None
>>> def bar():
... if False:
... foo = 'spam'
... print foo
...
>>> bar()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in bar
UnboundLocalError: local variable 'foo' referenced before assignment
因为foo
在bar
函数范围内绑定某处。但是,如果将foo
标记为全局,则该函数可以正常工作:
>>> foo = None
>>> def bar():
... global foo
... if False:
... foo = 'spam'
... print foo
...
>>> bar()
None
因为现在Python编译器知道你希望foo
成为全局的。
这些都记录在Python参考文档的Naming and Binding section中。
答案 1 :(得分:0)
另一个地方是变量在全局范围内声明,如果它在函数范围内使用,它应该特别引用为全局,否则会发生UnboundLocalError。以下是示例:
var = 123
def myfunc():
var = var + 1
print var
myfunc()
错误:
UnboundLocalError: local variable 'var' referenced before assignment