00:00
好,接下来呢,我们接着来说我们这个函数啊,再说一个关于函数一个也是一个比较重要的一个东西啊,我们创建一个新的文件,在这来说一下零六,我们叫做一个作用,作用域与我们这个命名空间啊命名空间嗯,那我们啊,又忘了写这个扩展名了啊,重复名一下,我们这直接来一个点一个P啊那这里边我们应该先说什么叫作用欲啊作用欲,那作用欲。作用域作用我就不说了,域呢,实际上我们叫做什么呢?叫做一个scope s cup,域什么意思呀?哎,域什么意思,叫做区域啊,叫做区域,那作用域直白上来说就是什么呀?产生作用的一个区域啊,产生作用一个区域,那这里我们的作用欲指什么呢?那注意我们这里边作用域指的什么呢?哎,指的哎是我们这个变量什么呀?哎,生效的一个区域啊,生效的一个区域,生效的一个区域什么意思?我们写一个变量,这变量不一定它是我们在我们整个的程序里都是可见的,比如说我在这定义一个啊,我这直接来一个定义一个这个函数,函数呢,我这里边写一个A等于十啊,然后我们这来写一个在函数内部啊,函数内部啊,函数内部我访问一个来什么呢?A等于,然后来一个A,这是在函数内部调用的,对吧,这个时候来一个FN,直接一直行。
01:30
这个A是不是可以访问到,哎访问到,但是我如果把这东西复制一下啊,CTRLC我来干嘛呢?我在函数外部啊,函数外部,哎函数外部我也来一个A等于A,那这时候我们来看看能不能访问的啊,我这一执行,哎干嘛了,是不是报错了,Name a is not DeFine是第几行啊,告诉你第十行,第十是谁,是不是就是这个呀?哎就说这个东西这个时候是没有办法访问的,为什么?因为此时此刻A的作用欲是什么?哎,AA定义在什么呢?哎,定义在了我们这什么呢?在了我们这个函数内部,哎,所以它的什么呀?哎作用于就是什么呀,函数内部函数外部干嘛呢?哎,无法访问啊,无法我问这听懂吧。哎,因为这个变量我们是在函数内部去定义的,所以它的作用域就是我们这个函数啊,就是我们这个函数,一旦出了这函数,它还能不能用了,哎,就不能。
02:30
能用啊,就不能用了,那我们再看一个啊,在这我来一个什么呢?哎,我来一个B,诶等于一个20,我有一个B了,哎,我有一个B了,然后在这啊,我直接复制一下,函数内部我来一个B等于B,然后呢,这我来一个函数外部也来一个B等于B,这时候我们来看这个B什么情况,我这诶像咱们先把这个呀,这个住了,因为它会报错啊一保存这一执行,诶你看B函数内部B等于20,函数外部是不是B也等于20,也就是说我们这个B它现在是在函数内部也可以访问,在函数外部也可以访问,那由此可见,这个B的作用范围是不是比我们这个A的作用范围要大呀,哎,B在哪都能看见,而A干嘛呀,只能在函数内部来看去,那所以你会发现我们不同的变量,它的作用域是不是不同啊,啊,它作用域是不同的,那这作用欲到底是怎么回事?那这里边我们来说一下啊,作欲指的就是我们变量生效的什么呀区域,那在我们的Python中,我们。
03:30
一共有两种作用欲,嗯,在我们的这个Python中,我们一共有什么呢?哎,一共有两种作用欲,哪两种作用欲一种我们叫做一个全局作用域啊,全局作用域还有一种我们叫什么呢?函数作用域啊,函数作用域一种叫全局作用域,一种叫函数作用域,我们先来说全局作用域,全局作用域顾名思义,它是不是在全局都有效啊,哎,有都有效啊,我们先说一下全局作用域在哪?诶或者说全局作用域它是什么时候创建的啊,什么时候创建的,我们说诶全局作用域它在什么呢?哎,在我们这个程序执行时创建啊,在程序执行时创建在什么呢?哎,在程序我们这个执行结束时销毁啊,结束时销毁,那注意我们全局作用域的一个,诶,一个它的生命周期,当你这个程序运,诶一旦运行起来,全局作用域就已经干嘛了有了。
04:30
程序一旦运行结束,全局作用域干嘛了,就没了啊,就没了,那具体来说,哪一个位置属于全局作用域呢?哎,我们来说一下所有什么呢?所有函数以外的区域,函数以外的区域都是我们这什么呀?全局作用域啊,所有函数以外,比如说在这儿来看这个是不是我们这函数体啊,哎,函数体它外边,哎从这开始,这些位置都属于什么呀?全局作用域,只要你的代码不是写到函数内部的,它都属于什么呀?都属于全局作用域啊,只要不是在函数里边的,那像这个就是什么呀,全局,那这个是不是,这个就不是,这就是什么呀,局部的是我们这个函式作用域啊,函数作欲好,那这里边注意了,我们来说一下,在我们这个全局作用域中,哎,我们定义的什么呀,变量,哎,都属于我们叫做什么呢?全局变量啊,在全局作用域中定义的变量都属于全局变量,全。
05:30
局变量可以在我们这个程序的什么呀?诶,任意位置被访问啊,任意位置被访问,所以这个时候你看我这个B就是一个什么B,它就是一个全局变量,哎,B就是一个全局变量,所以这个B你可以在函数外部访问到,也可以在函数内部访问的,为什么?就是因为它是一个全局变量啊,全局变量,所以注意全局作用个变量都是全局变量,它可以在任意个位置被访问,包括我们FN,实际上它也属于一个什么呀,全局变量,因为这个函数我们是不是在全局当中定义的呀,所以它也属于一个全局变量,这个东西也可以在任意位置被访问到啊,那这个就是我们全局作用域,这个东西很好理解,对吧?很好理解,就是它可以访问的范围啊,然后再来说我们的函数作用域,函数作用域是干嘛的?函数作用域我们还是说它什么时候创建,函数作用域在什么呢?在我们。
06:30
函数调用时创建啊在什么呢?调用这个结束时销毁啊在调用结束时销毁,那这里边注意我们的函数每调用一次,哎,就会产生一个什么呀?哎,新的叫什么呢?哎,叫做一个函数作用域啊函数作用域那注意了,函数作用域什么时候产生的?我现在这定义了一个函数,我要问你了,这个时候有没有函数作用域,有没有?哎注意这个时候还没有函数作用域,那函数作域什么时候有的?哎,我这调了一下函数,这个时候就产生了一个函数作用域,我又调了一下,又产生了一个,我还掉一下,诶又产生一个,每掉一次函数就会产生一个什么呀,函数等域,我这掉了三次就产生什么,就产生了什么呀,哎,三个函数作用域啊,每调用一次函数,就会产生一个函数作用域,啊函数作用域,那这里边我们来说了,在函数作用中。
07:30
干嘛呢?哎,在函数作用域中定义的这个什么呢变量,哎,只能在我们这个函数内部访问啊,只能在函数内部访问,或者说什么呢?在函数作用域中定义的变量都是什么呢?都是我们叫做局部变量啊,局部变量它只能在我们的函数内部被访问啊,它只能在函数内部访问,也就说这个像这个A是不是就是在这儿来定义的呀?哎,在函数内部来定义的,所以它只能在函数内部访问,在函数外部干嘛呢?哎,它是无法去访问的,所以刚才我们看到的这个A,它是不是只能在这儿被访问到,而一出来这个函数干嘛了,就没有办法访问,那所以这个就是我们所谓的一个叫做一个全局变量,还有一个局部变量,全局作用域中的是全局变量,可以在程序的任意位置被访问,而函数作用语当中的是局部变量,它只能在。
08:30
函数内部访问啊,只能在函数内部被访问到,那好,那所以啊,所以这个时候在函数里边能访问B,因为B是全局变量,而访问A也能访问AA是它的局部变量,而在外边A就没有办法访问了,因为A是什么呀,函数内部的局部变量,而这个B呢,是什么呀?诶是全局变量,所以在哪都可以去访问啊,在哪都可以访问,好,那还有一种特殊情况,什么情况呢?诶我们之前演示过了,我们说了我们这个函数是不是可以嵌套,哎,可以嵌套,我这会来定义一个啊FN2FN2,我这来一个A等于一个,这个30A等于30,那注意了,这两个A可就没关系了,这是FN2里的A,这是FN里的A,它们是两个不同的作用域啊,不同作用域,这个时候呢,我在这儿啊,在里边我定义一个FN3,你注意了,我是不是在函数里边又定义了一个函数,哎,在函数里又定义个函数,我们在这来一个普的一个A在这来打印啊,这是什么呢?这是FN3中啊FN3中然后这来一什么呢?直接打印啊。
09:30
A等于。来一杯啊,然后呢,我在FN2里边啊,我去调一下FN3,这是完事儿了,好,那接下来我再调一个什么呀,FN2这个结构如果你第一次看到会觉得有点乱啊,我们来看一下结构,首先有一个函数FN2,在FN2里边,我定一个变量叫做A等于30啊A等于30,然后在FN3之后干嘛呢?诶我去访问这个,诶然后我这是不是掉了FN3呀?哎,我这掉FN2是不是等于就掉了FN3了,哎,我们来看看这时候能不能访问啊,一直行A等于30,这时候是可以访问的啊,是可以访问到这个变量的,为什么?诶同学说老师你不是说它只能在函数内部来访问吗?好,我问你,我现在FN3它属不属于F2的函数内部,诶,当然属于,所以在FN3中就可以访问到这个什么呀,诶,因为FN3也处于FN2的一个内部啊,所以注意我们这个关系是什么,说白了是什么意思,假如说我们全局作用域是一个大的作用域,而我们的函数作用域是一个什么呀,小。
10:33
的作用域,我函数作用域里边是不是还有函数,哎,还有函数FN3又是一个函数作用域对吧?那也就是说什么意思,我可以从里,我从内部,从F3N3我能不能看到FN2是可以的,我从F3N3能不能看到全局也是可以的,也就是说什么意思呢?我可以从内往外看。你从我的内层的函数作用欲,我可以看到外层的函数作用欲,从我外层的函数作用,我也看到全局的函数作用欲,可以从内往外看,但是你想从外往内看能不能看,你想从全局看函数了能不能看,你想从外部函数看内部函数能不能看,是不能看的,哎,你可以从小的往大的看,诶内层往外层看,一层一层往外看,这是可以的,但是你由外往内你是看不见的,所以注意现在FN3可以看到它自己的,也可以看到FN2的,也可以看到哪也可以看到全局的啊,也可以看到全局的,但是但是全局能不能看到FN2的,诶,不能,那全局能不能看到FN3的,哎,也是不能的啊,这1.1定要注意啊,这点一定要注意好,那现在再来看,那假如说我在FN3里,我还有一个变量,FN3里边,我还有一个A等于一个40,那这个时候是不是发生冲突了,哎,我在这儿也有一个A在这儿呢,干嘛呢,也有一个A,那这个时候它会访问谁诶,它会访问谁诶。
11:52
哎,毫无疑问是不是肯定访问自己的,哎访问自己的我这一保存,我这一执行是不是就A等于40,这回访问的是什么呀,是40万,哎,40,所以这里边注意啊,我们来说一下,当哎我们使用一个变量时啊,当我们使用一个变量时,哎我们这样单独写一下吧,哎,我们叫做一个这个哎变量的一个查找,哎当我们去使用一个变量时。
12:20
哎,我们那个什么呢?哎,我们会优先啊,会优先哎在我们这个当前作用域中寻找该变量啊,会优先在当前作用域中寻找该变量,也就是说我们现在这调的是FN3,然后我在FN3里面是不是用了一个变量A啊,这个时候他在找这个变量的时候,它会干嘛?先在当前作用域,也就是说先在FN3当中去寻找啊,先在FN3中寻找,哎如果什么呢?如果有,如果有则什么呢?诶,如果有则。使用啊,如果有则使用啊,F3里如果有就使用,如果什么呢?如果没有啊,如果没有则继续,哎去我们这个上一集什么呀,作用域中寻找啊,上一级作用域中寻找,所以这里边假如说我FN3中没有,没有A,没有A,这个时候他就是不是找不到,自己没有啊,自己没有怎么办?去上一级,上一级有没有啊,哎有,所以这个时候就是什么呀,就是一个30啊,就是一个30,然后再往上,那如果上一级也没有啊,还是啊,如果有则什么呀?哎,如果有则使用,如果什么呢?哎,如果依然没有,依然没有,哎也就说上一级也没有了,哎,上一级也没有了,那怎么办?哎,是不是去上一级啊,再去上一级啊,A等于一个十啊,A等于十,这个时候是谁?是不是就十啊,哎十啊,则如果依然没有,则什么呢?
13:51
则继续去上一级作用域中寻找,那注意了,是不是意味着我上一级作用域这一定一定是全局了,不一定,我如果FN2那边还有一层函数,是不是接着上那层啊,如果还有是不是接着上那层啊?所以注意啊,我这函数嵌套无线,你嵌十层也没问题,虽然一般不会那么用,但是告诉你不一定说我上一级一定是全局作用欲,它会一级一级的去往上找啊,上一级作用中寻找,哎,以此类推,以此类推,那这个时候带来一个问题,如果说我全局作用域里边也没有怎么办?那这时候是不是意味着都没有啊,哎,都没有,我这一执行干嘛了,是不是报错了?告诉你a is not defend啊,A is not DeFine,那这个时候我们要说一下,如果什么呢?直的,哎,找到我们这个全局作用欲依然没有找到啊,依然没有找到则会什么呀,哎,则会抛出什么呀,异常啊,则以抛出异常什么异常啊,哎,我们这。
14:51
这块是一个什么呀?哎,Name error啊name error我直接粘过来啊,会抛出这么一个异常,那这个就表示什么意思,表示我们这个变量没有找到啊,变量没有找到,其实说白了就是什么呀,一层一层往上找,这个有点像什么呢?我们之前去讲那个命令行的时候,我们说有一个pass环境变量对吧?Pass环境变量我们的这个程序再去找一个东西的时候,它是什么呀?先在当前路径下去寻找对吧?然后是不是依次沿着我们pass环境变量的路径,一层一层找啊找到就用,找不到就干嘛呀,哎,就报错啊,找不到就报错,那这个跟那个是一个道理啊,一个道理,所以注意它是一层一层往上找的,你自己有就你自己的自己没有去外层找,外层有用外层的,外层没有再去外层找一直到哪,一直到什么呀,全局作用域啊,全局作用域,所以你注意它这个作用域之间是否有一个包含的关系的,大的作用欲里面包含了什么呀,小作用域它是一层却套着一层这样一个关系啊,这样一个关系,这就是我们说的一个什么呀,诶,这就是我们说这么一个叫做一个作用欲。
15:51
啊作用域好,那这一块理解了,然后我们再看一个问题啊,再看一个问题,那有些情况下是这样的啊注意我这来一个定义一个FN3FN3,那我要问你了,我这儿这个FN3跟这个FN3有没有关系,诶一毛钱关系都没有,为什么这个FN3是函数作用与里边FN3,而这个是什么呀?全局里的FN3啊,全局的F分三,这时候是这样的啊,这时候这样的,我这来一个什么呢?哎,我这来一个A等于一个20啊A等于20,然后在这我来一个A等于十啊,我们直接拿十演示了,我在这来普的一个哎的一个A等于一个什么呢?A打印一下A,然后我在这调一下FN3,我要问你的是,现在我这个A打印应该多少,应该是什么?应该是十吧,因为我是不是这有啊,哎,这有一个A,它就是十啊就是十好,我这去,哎,我先看运行一下,一直行是不是十啊,哎,那我这如果来整一个,我给它去掉了,哎我给它去掉了,那这时候应该多少,哎,这时候应该就是。
16:51
20啊,这时候应该就是事20,所以这个时候你要注意了,就是一个什么呀,局部没有就是什么呀,哎,就是访问的事全局的,哎访问的事外层的啊好,那接下来我们接着来说,我这来一个A等于十,那注意了这个是什么?诶注意啊,在我们这个函数中,哎,使用的变量。
17:15
呃,这个为变量赋值时,嗯,默认都是为我们这个叫做局部变量负值,所以注意我在这儿写了一个A等于十,默认情况下这个A都是什么呀,都是局部变量,你只要写什么什么什么等于它一定都是什么呀,局部变量啊,这是我们说的一个默认情况,那有同学说老师啊,我现在我不想去写A等于十,我不想去整局部变量,我想干嘛呢?我就想修改我们这个全局变量,诶我就想直接去修改这个全局变量,那这时候要怎么办?哎,那注意了,如果哎需要修改我们这个全局变量啊,修改全局变量咱们这样吧,我们先看一下啊,我们先看一下我这儿来一个A等于十啊,A等于十,现在我这改了对吧,然后呢,我这还是写一个啊,写一个这个是我们函数内。
18:15
还是内部?然后呢,我这复制一遍,在这FN3这我来一个,这是我们这个函数外部,我们来看这两个A的值一不一样啊,在函数内部我访问的是内部的A对吧?函数外部访问的是外部的A,内部的A应该是十,外部的是不是20啊哎,是20,这时候我一执行一个是十,一个是20,非常简单对吧?那假如说这里我就想修改的是全局变量,那怎么办?哎如果什么呢?如果希望在函数内部,诶修改我们这个全局变量,诶则需要使用我们一个什么呢?诶g BL global这个关键字,诶来什么呢?诶来声明变量啊,来声明变量什么意思啊,你现在不是希望去改全局变量吗?你在这儿你需要用一个什么呢?诶用一个g global,一个什么呢?A啊g global维,那这句话意思就是什么呢?哎,声明。
19:11
在函数内部的A,诶使用的A是什么呢?是全局变量,只有这时此时再去修改A时,哎,就是什么呀?哎,再修改我们这个全局的一个,诶啊全局的A,好,那现在写了1GLOBAL global global什么意思呀,在这儿就是全局的意思,或者你也可以说是一个全球的意思啊,全局意全局的A,那现在我这个A就不是局部的了,就变成什么了,全局的A,那这个时候我再给A复值,这也肯定是十,我们来看看外部的啊,外部的我这一保存走一个是外部也变成十了,哎外部也变成十了,那这个时候这就是它在干嘛?哎,这就是在修改什么呀?哎,修改全局变量,哎,修改全局变量,所以这个时候你注意在函数内部对变量赋值的时候,如果你不写global,全都是在对局变量赋值写上global,那就是什么了,就是全局变量啊,就是全局变量。
20:12
这个一定要区分,所以你要想修改全局变量,就加一个什么呀,加一个global就OK了啊,加一个global就OK了,好,那这个是我们说的一个作用域,其实非常的好理解,就是一个它基本上就是一个套娃的结构,我们从里边可以看到外边,但是从外边是无法看到里边的,里边对于外部来说是封闭的啊,是封闭的,好,这个是我们说的一个作用域,我们这里还停先停一下是吧,还有一个知识点,我们叫做一个命名空间,待会我们来说一下命名空间,把这个作用域,刚才我写的这几个函数自己来认真的写一下,把这个关系给他体会一下,搞明白一下,它这个嵌套关系啊,由内往外可以访问,但是由外向内是访问不了的,好好的去区分一下啊,区分一下,我们还是先停一下。
我来说两句