擅长:python、mysql、java
<p>你有两个选择。首先,注意在你的例子中,g实际上不是函数的局部(即没有在函数中赋值),它是全局的(即没有被赋值给局部变量)。这意味着它将在定义函数的模块中查找。这是幸运的,因为没有办法在外部更改局部变量(除了修补字节码),因为它们是在函数运行时分配的,而不是以前。</p>
<p>一种方法是简单地将函数注入函数的模块名称空间。这将起作用,但将影响该模块中访问变量的每个函数,而不仅仅是一个函数。</p>
<p>要只影响一个函数,您需要将该函数指向其他地方。不幸的是,这是一个只读属性,但是您可以通过重新创建具有相同主体但具有不同全局命名空间的函数来完成所需的操作:</p>
<pre><code>import new
f = new.function(f.func_code, {'g': my_g_function}, f.func_name, f.func_defaults, f.func_closure)
</code></pre>
<p>f现在是缩进的,只是它将在提供的dict中查找全局变量。注意,这将重新绑定整个全局命名空间-如果有f<em>查找的变量,请确保您也提供了它们。不过,这也相当老套,除了cpython之外,可能无法在python版本上工作。</p>