Python 为什么';t“中未定义的名称”;除「;提出一个命名错误?

Python 为什么';t“中未定义的名称”;除「;提出一个命名错误?,python,Python,今天,我惊讶地看到以下内容毫无例外地工作(至少在Python 2.7.3中是如此): 我本以为这会在REPL中引发一个namererror,类似于以下情况: >>> x = ThingThatDoesNotExist Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'ThingThatDoesNotExist' is not

今天,我惊讶地看到以下内容毫无例外地工作(至少在Python 2.7.3中是如此):

我本以为这会在REPL中引发一个
namererror
,类似于以下情况:

>>> x = ThingThatDoesNotExist
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'ThingThatDoesNotExist' is not defined
>>x=厚度不符合标准
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
名称错误:未定义名称“ThingAtDoesNotExist”

有人知道这里发生了什么吗?

同样的原因,这不会引发异常:

>>> True or ThingThatDoesNotExist

Python会在需要计算名称时立即查找名称。不需要求值的名称不会被查找,导致异常的是失败的查找。

您的测试不尝试任何内容,因此通过了测试。既然是这样,它就永远不会超过except子句。我可能弄错了,但是Python在对未定义的变量求值之前不会忽略它们吗?这正是这里发生的事情。Python不会检查该名称是否绑定到任何东西,直到它需要。只要将
pass
更改为
raisevalueerror
或其他什么,您就会得到
namererror
。回想起来——是的,这非常有意义。我想我现在喝的咖啡不够:)
>>> True or ThingThatDoesNotExist