<p>首先关注函数内函数的闭包情况:</p>
<pre><code>x = "xtop"
y = "ytop"
def func():
x = "xlocal"
y = "ylocal"
def inner():
# global y
print(x)
print(y)
y='inner y'
print(y)
inner()
</code></pre>
<p>注意被注释掉的<code>global</code>在<code>inner</code>中,如果您运行这个,它将复制您得到的<code>UnboundLocalError</code>。为什么?在</p>
<p>跑dis.dis公司上面写着:</p>
^{pr2}$
<p>注意<code>x</code>与<code>func</code>内部<code>y</code>的不同访问模式。在<code>inner</code>中使用<code>y='inner y'</code>创建了{<cd3>}</p>
<p>现在取消对<code>inner</code>内部的<code>global y</code>的注释。现在,您已经明确地创建了<code>y</code>作为顶级全球版本,直到您辞去{<cd7>}</p>
<p>如果<code>global</code>未注释,则打印:</p>
<pre><code>xlocal
ytop
inner y
</code></pre>
<p>您可以通过以下方式获得更合理的结果:</p>
<pre><code>x = "xtop"
y = "ytop"
def func():
global y, x
print(x,y)
x = "xlocal"
y = "ylocal"
def inner():
global y
print(x,y)
y = 'inner y'
print(x,y)
inner()
</code></pre>
<p>印刷品:</p>
<pre><code>xtop ytop
xlocal ylocal
xlocal inner y
</code></pre>
<hr/>
<p>闭包类的分析由于实例和类变量以及裸类(没有实例)执行的时间和时间而变得复杂。在</p>
<p>底线是一样的:如果你引用了本地命名空间之外的一个名称,然后在本地分配给同一个名称,你会得到一个令人惊讶的结果。在</p>
<p>“fix”是相同的:使用global关键字:</p>
<pre><code>x = "xtop"
y = "ytop"
def func():
global x, y
x = "xlocal"
y = "ylocal"
class Inner:
print(x, y)
y = 'Inner_y'
print(x, y)
</code></pre>
<p>印刷品:</p>
<pre><code>xlocal ylocal
xlocal Inner_y
</code></pre>
<p>您可以在<a href="https://www.python.org/dev/peps/pep-3104/" rel="nofollow">PEP 3104</a>中阅读有关Python3范围规则的更多信息</p>