在Python种,一切皆是对象。对象的存储放在堆内存中。
1、内存表(memory table)和变量表(variable table)
在Python中内存使用内存表来表示。内存表告诉我们数据在堆内存中的地址。我们通常使用变量(数据的引用,即地址)来指向数据。如下图所示:
变量 n
指向的内存地址为 2000
,内存地址 2000
所对应的值为 42
。同理可得 greet
变量的值为 hello
。
我们可以使用 id()
函数来查看一个对象的唯一标识,相当于人的身份证号码一样。Python解释器有很多种,例如 CPython、IPython、PyPy、Jython、IronPython
。不同的解释器对 id()
函数的实现方式不一样。CPython
中id()
函数使用对象的地址来唯一标识一个对象。
在 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
之间的字符都会事先在内存中设置好。以提高利用效率。如下图所示:
执行:
a=2
b=2
后,变量表为:
再执行:
c=a
后,变量表为:
2、List 的存储
执行:
list0 = [2, 4]
后,内存表和变量表为:
继续执行:
list1=list0
list0[0]=3
后,内存表和变量表为:
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()
每次一个函数被调用,该函数都会创建一个与之对应的局部变量表。该函数调用结束之后,对应的局部变量表也会被丢弃。
全局变量表有函数 g
和 change_list
以及 字符串名字 __name__
。函数 g
中 L = [1,2,3]
被执行后,内存表、全局变量表,局部变量表如下图所示:
调用 change_list
时,L
和 L1
指向相同的内存,L1[0] = 4
修改对应内存空间的值为4,如下图所示:
当执行 L1 = [3,2,1]
时,会创建一个新的 List,如下图所示:
当 change_list
执行完毕后,对应的局部变量表会被丢弃,如下图所示:
所以,最后的输出为:[4, 2, 3]
PS:字符串的存储和List的存储类似。