<p>实际上,Python范围解析的简明规则,来自<a href="https://rads.stackoverflow.com/amzn/click/com/0596513984" rel="noreferrer">Learning Python, 3rd. Ed.</a>。(这些规则特定于变量名,而不是属性。如果引用时没有句点,则适用这些规则。)</p>
<p><strong>法律规则</strong></p>
<ul>
<li><p><strong>L</strong>以任何方式在函数(<code>def</code>或<code>lambda</code>)内分配的本地名称,并且在该函数中未声明为全局名称</p></li>
<li><p><strong>E</strong>关闭函数-从内部到外部,在任何和所有静态封闭函数(<code>def</code>或<code>lambda</code>)的本地范围内分配的名称</li>
<li><p><strong>G</strong>全局(模块)-在模块文件的顶层分配的名称,或通过在文件中的<code>def</code>中执行<code>global</code>语句来分配的名称</li>
<li><p><strong>B</strong>uilt-in(Python)-内置名称模块中预先分配的名称:<code>open</code>、<code>range</code>、<code>SyntaxError</code>等</li>
</ul>
<p>所以,在这种情况下</p>
<pre><code>code1
class Foo:
code2
def spam():
code3
for code4:
code5
x()
</code></pre>
<p><code>for</code>循环没有自己的命名空间。按照法律的顺序,范围是</p>
<ul>
<li>五十: 局部在<code>def spam</code>(在<code>code3</code>,<code>code4</code>,和<code>code5</code>)</li>
<li>E: 任何封闭函数(如果整个示例位于另一个<code>def</code>)</li>
<li>G: 模块中是否有全局声明的<code>x</code>(在<code>code1</code>中)?</li>
<li>B: Python中的任何内置<code>x</code>。</li>
</ul>
<p>在<code>code2</code>中永远找不到<code>x</code>(即使在您可能希望的情况下,请参阅<a href="https://stackoverflow.com/a/23471004/2810305">Antti's answer</a>或<a href="https://stackoverflow.com/q/13905741/2810305">here</a>)。</p>