在Python种,一切皆是对象。对象的存储放在堆内存中。

1、内存表(memory table)和变量表(variable table)

在Python中内存使用内存表来表示。内存表告诉我们数据在堆内存中的地址。我们通常使用变量(数据的引用,即地址)来指向数据。如下图所示:

python查看内存变量 python查看内存地址的内容_模型


变量 n 指向的内存地址为 2000,内存地址 2000 所对应的值为 42。同理可得 greet 变量的值为 hello

我们可以使用 id() 函数来查看一个对象的唯一标识,相当于人的身份证号码一样。Python解释器有很多种,例如 CPython、IPython、PyPy、Jython、IronPython 。不同的解释器对 id() 函数的实现方式不一样。CPythonid() 函数使用对象的地址来唯一标识一个对象。

在 python 中 is 用来查看两个对象是否是同一个,即查看的是对象的内存地址是否相同。而 == 查看的是对象的值是否相同。

>>> a=-6
>>> b=-6
>>> a is b
False
>>> a=-5
>>> b=-5
>>> a is b
True
>>> a=255
>>> b=255
>>> a is b
True
>>> a=256
>>> b=256
>>> a is b
True
>>> a=257
>>> b=257
>>> a is b
False
>>> a='a'
>>> b='a'
>>> a is b
True
>>>

Python解释器启动的时候 [-5,256] 之间的数,以及 a-z、A-Z 之间的字符都会事先在内存中设置好。以提高利用效率。如下图所示:

python查看内存变量 python查看内存地址的内容_Python_02


执行:

a=2
b=2

后,变量表为:

python查看内存变量 python查看内存地址的内容_内存_03


再执行:

c=a

后,变量表为:

python查看内存变量 python查看内存地址的内容_模型_04

2、List 的存储

执行:

list0 = [2, 4]

后,内存表和变量表为:

python查看内存变量 python查看内存地址的内容_模型_05


继续执行:

list1=list0
list0[0]=3

后,内存表和变量表为:

python查看内存变量 python查看内存地址的内容_模型_06

3、函数和局部变量表

假设有如下代码:

def change_list(L1):
    L1[0] = 4
    L1 = [3,2,1]
def g():
	L = [1,2,3]
	change_list(L)
	print(L)
if __name__ == ’__main__’:
	g()

每次一个函数被调用,该函数都会创建一个与之对应的局部变量表。该函数调用结束之后,对应的局部变量表也会被丢弃。

全局变量表有函数 gchange_list 以及 字符串名字 __name__ 。函数 gL = [1,2,3] 被执行后,内存表、全局变量表,局部变量表如下图所示:

python查看内存变量 python查看内存地址的内容_Python_07


调用 change_list 时,LL1 指向相同的内存,L1[0] = 4 修改对应内存空间的值为4,如下图所示:

python查看内存变量 python查看内存地址的内容_内存表_08


当执行 L1 = [3,2,1] 时,会创建一个新的 List,如下图所示:

python查看内存变量 python查看内存地址的内容_Python_09


change_list 执行完毕后,对应的局部变量表会被丢弃,如下图所示:

python查看内存变量 python查看内存地址的内容_python查看内存变量_10


所以,最后的输出为:[4, 2, 3]

PS:字符串的存储和List的存储类似。