擅长:python、mysql、java
<p>如果您想操作<code>foo</code>的定义,可以直接用<code>global</code>语句和<code>=</code>来重新定义<code>foo</code>与分配任何其他全局变量的方式非常相似:</p>
<pre><code>def foo():
print('hi there')
def foo2():
global foo
def replacement_foo():
print('hi from over here')
foo = replacement_foo
def main():
foo2()
foo()
main()
</code></pre>
<p>只在<code>def foo(): ...</code>内部<code>foo2</code>而不是定义<code>replacement_foo</code>然后赋值也可能是安全的,但这就是<a href="https://docs.python.org/3/reference/simple_stmts.html#the-global-statement" rel="nofollow noreferrer">officially not permitted</a>,即使实现没有强制执行它。你知道吗</p>
<hr/>
<p>在注释中,您似乎对通过堆栈操纵<code>foo</code>非常感兴趣。<code>foo</code>的定义不在堆栈上,在执行<code>foo</code>期间,堆栈上没有对<code>foo</code>的调用,因此堆栈是错误的查找位置。你知道吗</p>
<p>另外,Python的大多数堆栈检查都是只读的。即使要重新分配函数的code对象,它也不会更改堆栈上已有的调用代码。您不能更改<code>main</code>的代码对象,使其不调用<code>foo</code>(尽管您可以更改<code>foo</code>的代码对象,这将在<code>main</code>调用<code>foo</code>时生效)。你知道吗</p>