ad

《自己动手写 Python 虚拟机》_更理解虚拟机的意义_6.2 变量和参数

网友投稿 136 2023-11-07

【摘要】 本书摘自《自己动手写 Python 虚拟机》一书中第6章,第2节,海纳编著。

6.2 变量和参数

在之前的实现中,变量的实现只依赖栈帧里的局部变量表。但我们知道,除了局 部变量,还有全局变量。这一节就来考察变量的作用域问题。

6.2.1 LEGB 规则

《自己动手写 Python 虚拟机》_更理解虚拟机的意义_6.2 变量和参数

Python 中,变量的作用域遵循 LEGB 规则。L 代表 Local, 局部作用域;E 代表 Enclosing, 闭包作用域;G 代表 Global, 全局作用域;B 代表 Builtin, 是语言内建作用 域。例如以下的三个例子,如代码清单6.8所示。

1 global x

2 x =0

3

4 def foo():

5 X = 2

6 def bar():

7 print x

8

9 def goo():

10 X=3

11 print x

return bar,goo

14

15 def func():

16 global x

17 X =1

18

19 func()

20 print x #this is 1

21

22 bar,goo =foo()

23

24 bar() #this is 2

25 goo() #this is 3

代码的注释里已经把结果标明了。在goo 方法里,已经定义了一个局部变量 x, 那么第11行要打印x 的值时,首先会去局部变量表里查找。在 goo 方法里是能查到 的,所以这里就会输出3,也就是说局部变量对全部变量x 造成了覆盖。

在 func 方法中,第17行明确地指定了要修改全局变量 x 的值,由原来的0改为 1,这里是直接修改了全局变量表中的 x, 而不是在局部变量表里创建新的变量。所 以这会导致第20行输出1。

在 bar 方法里,同样的查找顺序,先查找局部变量表,如果发现局部变量表里找 不到x, 接下来就会去定义 bar 的上下文去找,也就是 foo 的定义中找。可以看到 foo 里已经定义了x 为2。这种情况叫闭包,是比较复杂的一种情况。在本章的最后一 节会详细解释,这里大家只需要知道这是 Enclosing 规则的一个具体体现即可。

这个例子中缺少 Builtin 规则。Builtin 是在 Python 内建变量表,在这个变量表 里,常驻了很多Python 语言的重要变量,例如True 和 False 。 是的,出乎很多人的意 料 ,Python 中的 True 和 False 实际上是个变量。虽然我们几乎从来不去主动修改 Builtin 变量表,但这样做确实是合乎语法的,如代码清单6.9所示。

True,False =0,1

if False:

print"hello"

上面的例子是能输出hello 的,这是因为在程序的一开始,就把 False 设成了1。 后面再去对 False 这个变量进行求值的时候,它就成了True。

在详细地解释过 LEGB 规则以后,接下来就要思考如何向虚拟机添加这些 规则。

1.Global 变量

第一个要实现的就是 Global 变量。先看一下 Global 变量的具体例子,看看它 所对应的字节码究竟是怎样的,代码如代码清单6.10所示。

还是使用 global 的例子,将上述代码保存成一个 py 文件,编译以后通过 show_ file 来查看它的内容,字节码如代码清单6.11所示。

这个文件所对应的字节码里有两个是之前没见过的:STORE_GLOBAL 和 LOAD_GLOBAL 。 这两个字节码的作用都是操作全局变量,把局部变量放在了 FrameObject 的局部变量表里,与之类似,全局变量也放到 FrameObject 的全局变量 表里。先给 FrameObject 添加全局变量表,代码如下:

1 //runtime/FrameObject.hpp

2 class FrameObject {

3 public:

4

5 Map*_locals;

6 Map*_globals;

7

8 public:

9

10 Map*globals() (return_globals;}

11 };

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们 18664393530@aliyun.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:《Excel VBA跟卢子一起学早做完,不加班(实战进阶版)》_2.9.1 通过双击单元格从与其内容相同的单元格创建新表*
下一篇:跟着一起学《Excel VBA跟卢子一起学 早做完 不加班 基础入门版》_2.4.3 数据类型有哪些
相关文章

 发表评论

暂时没有评论,来抢沙发吧~

×