00:00
刚刚我们说了一下作用域,然后还有一个概念,我们叫做一个命名空间,那什么叫命名空间呢?那我们在说作用域的时候,我们说了有两种作用欲,一个是我们叫做一个全局作用域,还有一个是我们的函数作用欲,对吧?哎,我们说了作用欲就像一个这个俄罗斯的套娃一样啊,我们它是一层套一层,全局里边有什么呀?哎,有函数,函数里边呢,还可能还有函数,函数里边干嘛呢?还可能有函数对吧?我们说了从里边可以看见外边啊,我从里边可以看到外边,而从外边我是看不到什么呀,看不到里边的啊,看不到里边的这么一个意思啊,这里边我们所说的看到看不到指的是什么?指的是变量啊,指的是变量,那问题就来了,那既然是变量,我们说里边能看到外边,外边能看不到里边啊,看不到里边,那这个时候我们就产生了一个疑问,我的变量到底是保存到哪了呢?哎,变量是存储到哪了呢?
01:00
哎,那我们这里边接下来我们来揭开诶这个答案,我们的变量是存到哪的?变量就是存储到我们的命名空间当中的啊命名空间,所以接下来我们来说一下这个概念,叫做一个命名空间,命名空间诶命名空间叫做一个name space啊name space,那你可以发现name是不是就明亮,Space就是空间,所以所谓的命名空间是什么呢?诶就是我们变量存储的位置啊命名空间指的什么呢?诶命名空间哎指的哎是我们这个变量存储的这个位置啊位置每一个变量诶都需要存储到什么呢?哎,存储到我们指定的这个命名空间当中啊,都需要存储到指定的命名空间当中,那我们说命名空间有多少个,哎,每一个作用于诶都会有一个什么呀?哎,它对应的一个命名空间。比如说我们。
02:00
同学呢,全局作用域就会有一个全局的命名空间,我们的函数作用域就会有一个什么呀,函数的命名空间,全局命名空间用来保存什么呀?哎,我们来说一下全局命名空间,哎,用来什么呢?哎,用来保存我们这个全局变量啊,全局变量,而我们这个函数命名空间呢?哎呀,函数命名空间。哎,用来干嘛呢?哎,用来保存我们这什么呀?哎局部变量或者说是我们这个函数中的变量,哎函数中的变量一定注意啊,每一个每一个作用域,它都有它自己的一个命名空间,那这些变量都保存到这个命名空间当中,诶那可能同学这要说了,那命名空间到底是什么呀?哎到底是什么?其实这一说就很简单了,哎命名空间它实际上实际上就是一个什么呀?哎就是一个字典,哎是一个什么呢?哎是一个专门用来存储变量的字典,所以这里你要记住了,我们的Python里边的变量,实际上它都是保存到什么呀,保存到一个命名空间当中的啊,保存到命名空间当中,那我们怎么来获取这个命名空间啊,怎么来获取,那这里边我们来说一下,我们这说第一个函数叫做一个什么呢?叫做一个log。
03:26
啊,Logs logs什么意思?哎,本地啊,本地logs这个函数用来干嘛呢?诶,用来获取我们当前作用域的一个命名空间,当前作用域的一个命名空间啊locals什么叫当前作用域,如果看着啊,现在我是不是在我们的这个全局坐浴里掉掉刀啊,哎,所以注意啊,我们这来说一下,如果哎在我们这个全局作用域中,哎,调用我们这个locals。
04:05
哎,Locals,诶则什么呢?诶则获取我们这个全局命名空间,如果什么呢?如果在我们这个函数作用域中,哎,调用我们这什么呀,哎,Locals locals。则什么呢?哎则哎,获取我们这个函数的一个命名空间,那实际上注意它返回的是什么呢?它返回的是一个什么呀,字典啊,返回的是一个字典,我们这块来看吧,直接这来一个locals,我们这来整一下,直接s cup scope,我们来个玉啊,这就是玉的意思,Scope,那这个scope这就是什么,这个就是我们当前的命名空间,也就什么呢?也就是我们的全局命名空间啊全局命名空间直接打印一下,我们直接print啊print我们来一个这个scope,一保存一执行,你会发现我们这一打印是一个什么,是不是就是一个字典呀?诶你看这里面的东西是不是还不少啊,哎,还不少,你看什么什么name呀,Name呀,Do呀,Package里边有很多很多的东西啊,很多东西你看看,我们来找我们认识的,我们来看啊,这有一个什么BB是什么呀?20FNFN是一个什么呀?函数FN2 FN2是什么?也是一个。
05:20
函数A是不是一个变量啊,FN3是不是也是一个函数,甚至包括什么我们说的一个scope啊scope,那这个时候通过这个时候你就会发现我们这里的变量是不是在这里边都可以看见啊,哎,都可以看见,那现在我们来看一下,比如说在这儿我来打印一下A啊打印一下A,我直接一保存一执行,现在A的值是不是就是20啊,哎,就是20,所以注意,那其实我这打印A跟我打印什么呢?哎,Scope一个什么呢?一个A是一样,这两个东西是一模一样,我们来看是不是都是20啊,哎,都是20,为什么能这样,为什么?因为我们这个变量A实际上就是scope里边的一个什么呀,一个建式结构,那所以其实我们这里边直接来看啊,直接来看,直接来看type一个scope,你会发现就是什么呀,诶就是一个字典啊,它就是一个字典,我们的所有变量实际上都保存到这个字典里,甚至我也可以这么做,怎么做呢?来那同学说老师你。
06:20
既然说所有变量都保存这个字典里,那我向这个字典里添加一个键,是不是就等于我添加了一个变量呢?哎,我们来试一下啊,我先打印一个C,我这一执行,诶干嘛了,报错了,是不是告诉你c is not design的呀?哎,没有,那接下来干嘛呢?哎,我们来向死扣PE中来添加一个什么呀?哎,添加一个KY,诶添加一个KY的我直接写了啊直接写了来一个这个SCO中号,我们来一什么呢?C,这等于什么呢?等于一个1000,注意我现在没有什么变量啊,没有什么变量是不是只是在这添加了一个C啊,这个这个像对吧,我们生词典里添加一个像,那注意了,我们来说一下,哎,像我们这个字典中,哎添加我们这个KY的就相当于什么呢?
07:11
诶,在我们这个全局中创建了一个变量,一个变量,那这个时候我们打印C看效果啊,我这一执行1000是不是一样的呀?诶一样的啊,所以这里边我们就不用再多说了,你就知道实际上我们的所有变量都是保存到一个字典里边的,我们是不是可以通过操作这个字典连添加变量啊,哎,来添加变量这是可以的,但是注意我们一般干嘛呀啊,一般我们不建议这么做啊,一般不建议这么做,我们就演示一下行了,真正开发的时候不要这么做,你就知道所有变量都是保存到一个字典里边的就OK了啊就OK了。好接下来我们再来看我们这里边,我们来创建一个函数定义,我们来一个这个FN4啊,FN4这里边我看看没有FN4吧,哎,没有FN4,直接来一个FN4,那现在看到了,我这来一个scope等于一个logs,我是不是在这来在函数内部掉了一个logs呀?哎,那注意了,我们来说一下。
08:12
哎,这来说一下,在函数内部调用我们这个locals locals这样干嘛呢?哎,它会获取。获取到我们这个函数作用域,哎,函数的什么呀?哎,函数的一个命名空间啊,命空间注意了,这个scope在函数内部跟它可就不一样了啊,我们在这儿来打印一下,还是来一个print的一个s cup直接一保存,然后在这儿我们来看一下,诶直接调一下FN4啊FN4这一保存一执行对吧?里边有没有东西诶没有东西,为什么没有东西诶,因为现在我们的这个scope在函数内部,它是函数内部的命名空间,而我们函数内部有没有变量啊,哎,没有变量,所以它是空的,来我在函数部整一个变量,我来一个A等于十,现在函数内部是不是有变量了?哎,我这一执行是不是就是A冒号时就有了呀,啊就有了啊,所以注意这个logs,这个logs获取的什么?获取的是我们函数的作用域啊,函数作用域,那这里注意有一个小问题啊,有个小问题,刚才我们在外部的时候,全局的。
09:24
这个命名空间我们是不是可以修改啊,诶修改,但是看这儿我们能不能改啊,看这我能不能改,我还是来一个scope中号来一个什么呢?B等于一个20,我是不是又向scope里添加了一个,哎,我这一执行诶他没有报错,那这个时候这个B是不是也进来了呀?哎,也就是说我们通过这种方式是不是也向这个哎叫做一个什么呀?哎命名空间里添加了一个什么呀?哎添加了一个B啊添加一个B,那这个时候我们来打印一下,诶我们来打印一下这个B,我们来看有没有啊,有没有在这儿我先注掉这一保存一执行,是不是也有一个B等于20,诶也就是说我在这儿是不是也可以通过这个东西来对我们这个哎叫做什么呀,函数的命名空间进行操作,但是注意了,我们不建议这么做啊,还是也是可以什么呢?哎,可以通过我们这个scope,诶scope哎来操作我们这个什么呀,哎,操作我们这个函数的。
10:24
一个命名空间,但是同样不建议这么做,但是也是,哎,不建议这么做,哎,总之这个对象它的主要作用,它并不是让我们去改它的,而是什么呀,它就是这么一个容器,它替我们去存储变量,你有什么变量你就创建就行了,而这个东西是诶是不用你去操作的,甚至我们一般情况下也不用去获取它,你知道有这么这么一个东西,你知道我们的变量是存到这里边的就OK了啊,所以这里边注意Co啊,一个是这个locals啊,可以获取到我们当前的一个命名空间啊,当前的命名空间,那除了这个还有一个,还有一个叫什么呢?诶,那现在啊,那我要问你了,诶你假如说我想在全局里获取到这个它的命密空间,我能不能获取到,哎,注意这个时候你是获取不到的,注意一定是获获取不到的,因为我们说了,从外部是没有办,从外部是没有办法访问到内部呀,哎,访问到。
11:24
内部这是不能去访问的,哎,那我要想从外部访,从内部访问内外部的咪密空间行不行呢?哎,那当然意我通过logs是不行的,那我可以通过什么呢?来这里边我们来说一下这个先给它注掉啊先给它注掉,我们还有一个东西叫什么呢?叫做g global,叫做一个个global,诶global它也是一个函数,Global这个函数它干嘛呢?诶它可以用来获取我们的全局命名空间,诶它可以用来什么呢?诶用来在我们这个任意位置来获取全局命名空间,也就是说在这儿看着啊,我来一个这个的一个s cup scope等于一个这个什么呀,Global我在这儿来调了一下这函数,那现在这个global SCO就是我们的全局命名空间,我这一打印来看一下这个语法错误,这块我们报报了一个错,我们来看一下啊,Global应该是globals啊这。
12:24
执行,诶,这时候打印出来了,哎,打印出来了你会发现这个东西跟我们外边打印那个实际上是不是一样啊,哎,那注意GLOBAL4啊,Globals获取到的就是我们的全局命名空间,那你也可以通过它来干嘛呀?哎,来去获取我的全局变量一执行这个A是不是就是20啊,诶这个A是十,而全局里边那A是20,所以在这儿你也可以通过这个globals啊,Globals来操作我们这个全局,诶命名空间啊,全局命密空间,那我们这儿来看看,我们来尝试着去修改一下啊,修改一下直接来一个global,一个这个scope,诶来一个A。
13:03
哎,等于个30,然后在这儿呢,在函数外边我们再打印一下这个,诶这一保存一执行是不是A就变成30了,哎,也就是说我们在函数内部可以通过什么呀?哎,Globals来获取我们这个全局的一个命名空间啊,全局命名空间也可以通过它来获取我们这个全局当中的谁间什么呀变量,甚至可以对它进行修改,但是还是一般情况下也是不建议你去这么做,因为这样做起来其实它不太清晰,你这个代码的阅读起来就相对来说会有一些费劲了啊,会有些费劲了,好,那它这个就是我们说的命名空间,总结一下,简单总结一下啊,命名空间实际上就是一个字典,它是用来专门存储变量的字典,在全局中有全局的命名空间,哎,在函数里边有函数的命名空间,通过logs可以获取当前命密空间,而通过我们的globals可以干嘛呢?获取全局的啊,可以获取全局的还是一定注意我们从函数这我可以看到global,诶看到。
14:03
全局,但是我们在全局里边是看不到什么呀,函数的命名空间啊,是看不到的,好,那这里是我们说的一个这个命名空间,我们来听一下。
我来说两句