十三、python基础:变量的作用域1(内存引用和释放)

十三、python基础:变量的作用域1(内存引用和释放)

在谈到变量的作用域之前,我们先对python解释器运行时代码的执行顺序、内存分配、内存引用、内存释放机制先了解一下。

1、运行一个py文件时,python解释器是怎么工作的?

在pycharm运行一个py文件时,我们右键点击run,它就会执行。这时候,python解释器是从上往下一行一行地解释翻译成机器码。
我们以下面这个例子来说明一下:

i = 0
def add(a, b=1):
    i += a
    
add(1)
print(i)

这个例子没什么具体的意义,但可以分析一下解释器怎么运行的。
当你右键运行时,解释器从上往下扫描代码,遇到i=0,就在内存空间开辟一个地方,存放i对应的值。继续往下看到定义了函数add,这时候它不会调用函数的,它会先看到函数内部还有一个默认参数b=1,又开辟了一块内存来存放b的值。继续往下看到了调用add函数,于是它返回去把这函数调用一遍,最后看到调用了print函数,就输出在控制台。输出结束时,整个文件的执行就结束了,原先存放在内存中的各个变量就释放出来了。

这整个流程我们就大致清楚了。

但需要注意的是:内存引用机制的几个相关问题

1、怎么知道变量存在内存中的哪里?

我们可以使用id(a),来获得变量a存放的内存地址。

2、对一个变量重新赋值的过程中,解释器是否会重新开辟内存空间给它;

会的。
在这里插入图片描述
这里可以看到,2次对同一个变量a重新赋值,它的内存地址改变了。说明解释器重新开辟了内存空间给这个变量使用。

3、对一个变量进行修改时,解释器是在原地址进行修改,还是给它修改后存放到一个新的内存空间;

这个要看变量是什么类型的,执行的修改操作是什么。
这个问题比较复杂些。我在做项目过程中有遇到过这个问题,如果有兴趣可以看我另一篇文章:
python的大坑:使用空列表作为默认参数,让我怀疑遇到了灵异代码

里面还有讲到django框架在内存释放上的问题,跟你单独执行一个py文件,是不一样的。

最后,涉及内存方面的问题,我这里讲得不是很多,但新手知道这些基本差不多了,想知道更多的话,可以搜索一下别人的文章。

发布了55 篇原创文章 · 获赞 77 · 访问量 9494

猜你喜欢

转载自blog.csdn.net/Jacky_kplin/article/details/104817264