wang1313131313 发表于 2023-3-27 17:09:15

大佬帮帮忙 求助legb

本帖最后由 wang1313131313 于 2023-3-27 17:11 编辑

为啥是20 不是10呢

isdkz 发表于 2023-3-27 17:17:13

当我们调用 outer() 函数时,首先会定义局部变量 a 并将其值设置为 10。然后调用 inner() 函数。在 inner() 函数中,我们试图打印变量 a 的值。

然而,inner() 函数没有定义局部变量 a,所以它会在它的外围作用域中寻找变量 a。在这个例子中,inner() 函数并没有直接嵌套在 outer() 函数内,所以它不会直接访问 outer() 函数的局部变量。而是在全局作用域中寻找变量 a。

在全局作用域中,变量 a 的值为 20。因此,当 inner() 函数执行 print(a) 时,它打印的是全局变量 a 的值,即 20。所以,程序的输出为 20,而不是 10。

wang1313131313 发表于 2023-3-27 17:19:14

isdkz 发表于 2023-3-27 17:17
当我们调用 outer() 函数时,首先会定义局部变量 a 并将其值设置为 10。然后调用 inner() 函数。在 inner() ...

感谢

wang1313131313 发表于 2023-3-27 17:23:12

isdkz 发表于 2023-3-27 17:17
当我们调用 outer() 函数时,首先会定义局部变量 a 并将其值设置为 10。然后调用 inner() 函数。在 inner() ...

请问那么这个例子符合legb原则吗?谢谢

isdkz 发表于 2023-3-27 17:29:17

wang1313131313 发表于 2023-3-27 17:23
请问那么这个例子符合legb原则吗?谢谢

这个例子符合LEGB原则。LEGB原则是Python中用于解析变量名的顺序规则,它代表以下四个层次的作用域:

1、Local(局部):指当前函数或方法内部的作用域。
2、Enclosing(外围):指包含当前函数的外部函数的作用域,从内到外的顺序。
3、Global(全局):指当前脚本或模块的作用域。
4、Built-in(内置):指Python内置的名字空间,包含了Python的内置函数和异常等。


在这个例子中,当inner()函数试图访问变量a时,解释器会按照LEGB原则进行查找:

1、Local(局部):在inner()函数内部没有找到变量a。
2、Enclosing(外围):inner()函数没有外围函数,因为它并不是outer()函数的内部函数。
3、Global(全局):在全局作用域中找到了变量a,其值为20。
4、Built-in(内置):在这个例子中,我们不需要查找内置作用域。

根据LEGB原则,解释器在全局作用域中找到了变量a,因此inner()函数打印的是20。所以这个例子确实符合LEGB原则。

wang1313131313 发表于 2023-3-27 17:58:22

isdkz 发表于 2023-3-27 17:29
这个例子符合LEGB原则。LEGB原则是Python中用于解析变量名的顺序规则,它代表以下四个层次的作用域:

...

谢谢
页: [1]
查看完整版本: 大佬帮帮忙 求助legb