Python:从外部函数

时间:2018-01-14 09:03:38

标签: python closures python-nonlocal

考虑以下示例:

def g():

    in_g=100

    def f1():
        nonlocal in_g
        in_g = 10

    def f2():
        nonlocal in_g
        print(in_g)

    return (f1,f2)


(f1, f2) = g()

f2() #prints 100
f1()
f2() #prints 10

内部函数f1f2在其“闭包”中都具有对变量in_g的访问权限。 但是,g返回后,内存中的in_g保存在哪里?

我假设g正在执行时,in_g是堆栈帧上的一个变量,对应于对g的调用。因此,gf1f2在使用变量in_g时都会访问相同的内存位置(在堆栈上)。

但是,如示例所示,在g返回后,f1f2在引用in_g时仍会访问相同的内存位置。但是,现在g返回,该内存位置不再在堆栈中。

2 个答案:

答案 0 :(得分:0)

上述代码的输出为100& 10。

因为第一次调用f2()所以它直接访问in_g变量&打印它的值。在那之后f1()调用&它将in_g变量值更新为10.然后f2()函数再次调用,因为非本地语句它绑定了先前的值,这就是它打印10值的原因。

非本地语句会使列出的标识符引用最近的封闭范围(不包括全局变量)中的先前绑定变量。这很重要,因为绑定的默认行为是首先搜索本地名称空间。除了全局(模块)范围之外,该语句还允许封装代码重新绑定局部范围之外的变量。 与非全局语句中列出的名称不同,非本地语句中列出的名称必须引用封闭范围中的预先存在的绑定(无法明确确定应创建新绑定的范围)。 非本地语句中列出的名称不得与本地范围中的预先存在的绑定冲突。

答案 1 :(得分:0)

我相信我在这里找到了答案:http://stupidpythonideas.blogspot.ro/2015/12/how-lookup-works.html

因此,当访问in_g时,gf1f2访问cell variable,而// Class Variables private Handler mHandler; @Override public void onCreate(){ // Create a Handler Object // In Layman's terms, Handlers can run processes off the main // User interface thread. mHandler = new Handler(); // Post a "Runnable" after a delay in milliseconds // On a separate thread, the progressDialog_Runnable // will call the function "createProgressDialog" mHandler.postDelayed(progressDialog_Runnable, 250); } // Runnables (Process to run on separate thread) private Runnable progressDialog_Runnable; { progressDialog_Runnable = new Runnable(){ @Override public void run() { createProgressDialog(); } }; } // Method you create to make the progress dialog private void createProgressDialog(){ //... Run this code on a separate thread via Runnable } 依次拥有对实际对象的引用。