擅长:python、mysql、java
<p>您正在<code>setter()</code>函数中设置一个<strong>局部</strong>变量<code>x</code>。对函数中的名称赋值会将其标记为本地名称,除非您特别告诉Python编译器。在</p>
<p>在Python3中,可以使用<code>nonlocal</code>关键字显式地将<code>x</code>标记为非本地的:</p>
<pre><code>def make_adder_and_setter(x):
def setter(n):
nonlocal x
x = n
return (lambda y: x + y, setter)
</code></pre>
<p>现在,<code>x</code>被标记为一个自由变量,并在分配给时在周围的范围中查找。在</p>
<p>在python2中,<em>不能将Python标记为本地的。唯一的另一个选项是将<code>x</code>标记为<code>global</code>。您将不得不使用一些技巧来更改位于周围范围内的可变对象所包含的值。在</p>
<p>在<code>setter</code>函数上的<em>属性可以工作,例如,<code>setter</code>是<code>make_adder_and_setter()</code>作用域的本地属性,任何可以访问<code>setter</code>的对象都可以看到该对象上的属性:</p>
^{pr2}$
<p>另一个技巧是使用可变容器,例如列表:</p>
<pre><code>def make_adder_and_setter(x):
x = [x]
def setter(n):
x[0] = n
return (lambda y: x[0] + y, setter)
</code></pre>
<p>在这两种情况下,<em>不再</em>分配给本地名称;第一个示例使用<code>setter</code>对象的属性赋值,第二个示例更改<code>x</code>列表,而不是赋值给<code>x</code>本身。在</p>