好吧, 我们来玩个小游戏｡
你能猜出这个程序的输出是什么吗？
我这里有一个等于一的｡
然后我们创建了一个叫做confusion的函数, 这里我们有一个等于5的值, 我们返回a｡
我的问题是, 当我们打印A, 当我们打印混乱, 你期望这里发生什么？
如果你需要的话, 花点时间想想暂停｡
让我们来看看｡
一和五｡
这是你所期望的吗？
我们走吧｡
一行一行的｡
首先我们给变量A赋值1, 然后我们创建一个名为confusion的函数python解释器会说, 好的, confusion, function.
我知道那是什么｡
我要把它放在内存中｡
需要我帮忙的时候, 告诉我一声｡
然后它会转到第八行, 第八行会说, 嘿, 打印a是什么,
我唯一一次看到a是在这里, a等于1｡
进入内存, 假设A等于1｡
但当我像这样混乱的时候｡
我会说, 嘿, a会等于5现在我们返回A也就是5｡
OC如果我改变这个的顺序呢？
如果我这样走呢？
如果单击“运行”会发生什么情况？
这是你所期望的吗？
再一次, 我们有一个平等的｡
然后我们定义函数, 然后打印混乱｡
现在这里的混乱就是给a赋值等于5然后返回a.
但为什么这一点没有改变？
为什么我们到这里的时候a还是等于1？
这是因为范围, 对吗？
当Python解释器运行混淆函数的时候, 它会说, 嘿, a等于5｡
但我在我自己的宇宙中创造了一个变量A｡
我不知道什么是平等的｡
我有自己的世界｡
在我们运行这个函数之后, 我们就完成了｡
我们已经返回了函数, 但它完全消失了｡
但我们从未离开宇宙进入全球范围｡
所以Python解释器检查变量时需要遵循一系列规则｡
规则是这样的｡
首先, 它要和当地人核实一下｡
所以从本地开始｡
我们称之为局部作用域｡
局部作用域是这个局部函数的一部分｡
所以一个是局部范围｡
他会在那里过牌｡
我知道变量吗？
A嗯, 是的, 等我回来的时候｡
A我在这里定义了一个变量, 所以它从那里开始｡
但假设A不在那里, 假设我删除了a, 然后在这里单击运行｡
因为第二个规则是如果局部变量或局部作用域中没有任何内容, 那么第二个规则是,
是否有父局部作用域？
在我们的例子中, 这个函数的父级是什么？
这是全球范围的｡
但我们还可以做另一个功能｡
假设parent和parent是混淆函数的父项｡
在这里, 假设A等于10｡
现在在这里｡
我们会再来的｡
混淆只是为了让我们可以再次使用它, 并实际运行它｡
那我们打电话给家长吧｡
然后单击“运行”｡
好吧, 我们来看看｡
所以不会太混乱｡
我们有被调用的父函数｡
所以当我们调用它的时候, 我们给10赋一个等于｡
然后我们也创造了一个新的功能混淆｡
最后, 我们返回confusion并运行它｡
所以我们要返回a然后在这里打印出A的值, 也就是10.
为什么呢？
因为我们首先从局部范围开始｡
嘿, 混乱知道a是什么吗？
不知道｡
我的本地范围中没有它｡
OC我的父母当地学校有吗？
所以它会上一层, 问, 父函数知道a是什么吗？
是的, 我有一个等于10的, 所以它会打印出来｡
第三个规则或第三个顺序是全局性的｡
全局就是我们所说的无缩进｡
是这个文件, 对吧？
无论文件包含什么内容, 都是全局的｡
在我们的例子中, 如果A等于10这里不存在, 就没有局部变量, 也就没有父局部变量｡
然后单击“运行”｡
它检查全局范围｡
最后, 还有一条规则, 这是第四条, 这是一个棘手的规则｡
这就是我们所说的内置Python｡
或者内置的Python函数｡
所以Python自带了预定义的函数, 比如？
我们之前讨论过的那个数目｡
这有些让我们说, 只是给予它五｡
是要去检查还是实际上, 咱们什么都不给予它｡
我们就在这里做吧｡
当我运行这个｡
我有一些内在的功能｡
现在就去
他们怎么知道这是什么？
这个变数到底是什么？
因为它说, 嘿, 我在这个宇宙里面有一些吗？
不知道｡
我不知道｡
我的父范围中是否有一些？
不, 我不知道｡
我在全球有吗？
不知道｡
这里面没有任何东西｡
最后它要检查的是, 嘿, 是某种内置的Python函数吗？
是的｡
Python实际上给了我们一些, 这样你就可以使用它, 这样它就不会出错了｡
这就是Python解释器所遵循的作用域规则｡
非常, 非常酷｡
我们还需要学习一些东西｡
所以我们在下一个视频中再见｡