未绑定的变量和名称

时间:2014-02-28 17:25:21

标签: python variables namespaces

关注我们的python reference manual

  

如果根本找不到名称,则会引发NameError异常。如果   名称是指尚未绑定的局部变量,a   引发UnboundLocalError异常。 UnboundLocalError是一个子类   NameError。

我不承诺UnboundLocalError何时造成?因为

  

Python缺少声明并允许进行名称绑定操作   代码块中的任何位置。

那么我们如何声明一个变量,而不是初始化她?

2 个答案:

答案 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

因为foobar函数范围内绑定某处。但是,如果将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