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'],计算机底层会发生以下几件事:

  1. 在内存 栈区 中开辟一个名称空间,存放 x 。
  2. 在内存的 堆区 中开辟一个内存空间,把列表放进去。同时,列表里面再存储 18 和 'ma' 的内存地址。
  3. 将列表的内存地址赋值给 x 。

如图所示:

列表在内存中的存储方式.png

因此,我们说的列表可变是指列表中的元素是可变的,修改列表中的元素不会影响到列表本身在内存中的存储地址。

我们可以用一个比喻说明:

列表是一个瓶子,我们不管往瓶子里面放的是酒、还是水都不影响瓶子本身。 x 这个名字指向了列表,就相当于我们手里拿着瓶子,不管瓶子里面装水或是酒,都不会改变我们拿着的这个瓶子。

字典的存储方式也是如此,只不过列表里面存储的是索引对应值的内存地址,字典存储的就是 key 对应的值的内存地址。