Python列表在内存中的存储方式
MJX2022/07/18Python数据类型
变量赋值的原理
首先我们先来讲一下变量赋值的底层原理,假设运行 age = 18 ,计算机会进行以下 3 步操作:
① 在内存 栈区 中创建 age 这个变量名的名称空间。
② 在内存 堆区 中创建 18 这个值。
③ 等于号(=)表示赋值的意思,会把堆区中数据 18 的内存地址指向给栈区中变量名 age 。
所以,在计算机中age = 18的表示,并不是 age 等于 18 ,而是 age 等于 18 这个值的内存地址。
列表在内存中的存储方式
假如运行以下代码:
x = [18, 'ma']
print(x, id(x))
>> [18, 'ma'] 2288075880960
x[0] = 19
print(x, id(x))
>> [19, 'ma'] 2288075880960
提示
id( ) 函数可以取得变量所指向的 内存地址
>> 符号表示输出
从上述代码可以看出列表的值虽然变了,但列表的地址却没有变。声明一个列表 x = [18, 'ma'],计算机底层会发生以下几件事:
- 在内存 栈区 中开辟一个名称空间,存放 x 。
- 在内存的 堆区 中开辟一个内存空间,把列表放进去。同时,列表里面再存储 18 和 'ma' 的内存地址。
- 将列表的内存地址赋值给 x 。
如图所示:

因此,我们说的列表可变是指列表中的元素是可变的,修改列表中的元素不会影响到列表本身在内存中的存储地址。
我们可以用一个比喻说明:
列表是一个瓶子,我们不管往瓶子里面放的是酒、还是水都不影响瓶子本身。 x 这个名字指向了列表,就相当于我们手里拿着瓶子,不管瓶子里面装水或是酒,都不会改变我们拿着的这个瓶子。
字典的存储方式也是如此,只不过列表里面存储的是索引对应值的内存地址,字典存储的就是 key 对应的值的内存地址。
