十三、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文件,是不一样的。
最后,涉及内存方面的问题,我这里讲得不是很多,但新手知道这些基本差不多了,想知道更多的话,可以搜索一下别人的文章。