首先我们认为python中的域搜索遵循的顺序是local->Enclosing->Global->Built-in:a=1deffunc1():...print(a)...a=111...print(a)...func1()Traceback(最近调用最后一次):文件“”,第1行,在文件“”,行2、在func1UnboundLocalError:localvariable'a'referencedbeforeassignmentwhile:a=1deffun():...print(a)...b=111...print(b)...fun()1111print(b)Traceback(mostrecentcalllast):File"",line1,inNameError:name'b'isnotdefined我们可以得出一个结论(slap):内置函数首先在内置函数的定义域(前后)寻找变量;找不到后从全局变量中导入,局部变量无法全球化。ifglobal:a=1deffunc1():...globala...print(a)...a=111...print(a)...func1()1111a111但是没多久我发现了一个问题,代码如下:a=10deftest():...a=a+1...print(a)...test()Traceback(mostrecentcalllast):File"",第1行,在文件“”中,第2行,在testUnboundLocalError中:局部变量“a”在赋值之前引用TypeError:test()takes0positionalargumentsbut1wasgiven所以这个问题其实可以拆分成两个问题,一个是参数的问题,一个是变量的问题。定义了参数后,只要将全局中的变量代入括号内即可运行,前提是必须定义!!!a=1deffunc1(a):...print(a)...a=111...print(a)...func1(a)1111也就是说问题根本不是全局的,而是是不是我把a带进去了……(哭)结论是一切都是自我放纵和想太多,我自己的buga=10deftest(a):...print(a)...a=a+1...print(a)...test(a)1011那么回到第一个例子,所谓的“赋值前引用的局部变量”只是因为我定义的时候没有把变量放进去。这是第一件事也是第二件事:只有模块、类和函数会引入新域,其他代码块如(if/else,while)不会:a=0whilea<4:...print(a)。..a+=1...0123a4三:嵌套和闭包defout():...a=7...definner():...nonlocala...print(a)...a=9...print(a)...inner()...print(a)...out()799嵌套和nonlocal超级好理解让我斯巴达如下:deffun2(a):...print(a)...deffun3(b):...print(a,b)...returnfun3#returnfun3函数的结果...fun2(1)1.fun3at0x000001E2857C24C8>f=fun2(1)1f.fun3at0x000001E2857A4828>f(4)14嗯,这就是传说中的闭包,闭包让函数里面的变量始终可以在外部保存和使用(就像一个始终将变量包装在内部的免费包)更直观:defout():...definner():...a=5...returna...inner()...returninner...f=out()f.innerat0x000001E2857A4678>f()5可以看出调用了这个定义的函数,返回的仍然是函数,不是值。out()不是函数运行结果,而是返回的内部函数和变量a组成的函数(因为闭包的本质是局部变量和内部函数组成的函数)。更具体地说,在第一个示例中,运行fun2(1)将同时打印出一个a和一个使用fun3作为函数的函数,保留的a和未分配的b作为变量。[当定义满足闭包条件时,自由变量(此处为f)成为闭包类,具有函数的作用]。至于为什么它的地址在变化,我想是因为它每次调用都会返回一个新的函数(单独存储)。233333我看到了另一个神奇的东西defcount():...fs=[]...foriinrange(1,4):...deff():...returni*i...fs.append(f)...returnfs...f1,f2,f3=count()f1.fat0x000001E2857A4438>f1()9f2()9f3()9functionhere的原因闭包是追加的f,如果我进行更改defcount():...fs=[]...foriinrange(1,4):...deff():...returni*i...fs.append(f())...returnfs...count()[1,4,9]不是闭包,count可以正常输出结果。这里返回的函数是i*i,但是由于返回时i=3,所以f1、f2、f3都变成了9。