擅长:python、mysql、java
<p>首先,要明白python将检查模块的语法,如果它检测到无效的内容,它会发出一个<code>SyntaxError</code>,这会完全停止它的运行。您的第一个例子提出了一个<code>SyntaxError</code>,但是要确切地理解原因是相当复杂的,尽管如果您知道<code>__slots__</code>是如何工作的,那么就更容易理解了,所以我将首先快速介绍这一点。在</p>
<hr/>
<p>当一个类定义<code>__slots__</code>时,它基本上是说实例应该只具有那些属性,这样每个对象都被分配了内存,只为这些属性分配空间,试图分配其他属性会引发错误</p>
<pre><code>class SlotsTest:
__slots__ = ["a", "b"]
x = SlotsTest()
x.a = 1 ; x.b = 2
x.c = 3 #AttributeError: 'SlotsTest' object has no attribute 'c'
</code></pre>
<p><code>x.c = 3</code>不能工作的原因是没有内存空间来放置<code>.c</code>属性。在</p>
<p>如果不指定<code>__slots__</code>,则所有实例都是用字典创建的,以存储实例变量,字典对它们包含的值没有任何限制</p>
^{pr2}$
<hr/>
<p>Python函数的工作原理类似于<code>slots</code>。当python检查模块的语法时,它会在每个函数定义中找到分配(或试图分配)的所有变量,并在执行期间构造框架时使用这些变量。在</p>
<p>当您使用<code>nonlocal x</code>时,它给了一个内部函数访问外部函数作用域中的特定变量,但是如果外部函数中没有定义变量,则<strong><code>nonlocal x</code>就没有空间可指向。</strong></p>
<p>全局访问不会遇到相同的问题,因为python模块是用字典来存储其属性的。因此,即使没有对<code>x</code>的全局引用,也允许<code>global x</code></p>