<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>ocal-在函数(<code>def</code>或<code>lambda</code>)中以任何方式分配的名称,并且在该函数中未声明为全局的</p></li>
<li><p><strong>E</strong>nclosing function-在任何和所有静态封闭函数(<code>def</code>或<code>lambda</code>)的局部范围内指定的名称,从内部到外部</p></li>
<li><p><strong>G</strong>lobal(模块)-在模块文件的顶层分配的名称,或通过在文件内的<code>def</code>中执行<code>global</code>语句分配的名称</p></li>
<li><p><strong>B</strong>内置(Python)-在内置名称模块中预先分配的名称:<code>open</code>、<code>range</code>、<code>SyntaxError</code>等</p></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>L:localin<code>def spam</code>(in<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>B:Python中的任何内置{<cd16>}</李>
</ul>
<p><code>x</code>将永远不会在<code>code2</code>中找到(即使在您可能期望的情况下,请参见<a href="https://stackoverflow.com/a/23471004/2810305">Antti's answer</a>或<a href="https://stackoverflow.com/q/13905741/2810305">here</a>)</p>