考虑以下示例:
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
内部函数f1
和f2
在其“闭包”中都具有对变量in_g
的访问权限。
但是,g
返回后,内存中的in_g
保存在哪里?
我假设g
正在执行时,in_g
是堆栈帧上的一个变量,对应于对g
的调用。因此,g
,f1
和f2
在使用变量in_g
时都会访问相同的内存位置(在堆栈上)。
但是,如示例所示,在g
返回后,f1
和f2
在引用in_g
时仍会访问相同的内存位置。但是,现在g
返回,该内存位置不再在堆栈中。
答案 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
时,g
,f1
和f2
访问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
}
依次拥有对实际对象的引用。