这事算是告一段落了
        

2020.9.6号更新

         最终总结 最终总结 python中 list 到底是怎么实现的,内存里面是怎么存放的

        

接上一篇 python修改列表的值时的地址变化,一个蛮有意思的小实验

上一篇说到了

  • 添加:在原来的最后地址 a[-1] 往后移动了添加的值 - 原列表最后一个元素的值个整数(列表数据类型)所占的字节,用来存放要添加的值,然后起个别名。这儿的别名是原列表的最后索引+1,比如原来列表有四个元素,最后索引是 a[3] ,进行一次添加操作后,新添加的这个元素的别名就是 a[4]

我发现仅对整型元素是这样,字符元素就不行了

a = [1,'a',2,'b']
print("原始的各元素id:")
for i in range(len(a)):
    print(id(a[i]))

a.append(3)
print("添加一个整型元素后各元素id:")
for i in range(len(a)):
    print(id(a[i]))

a.append('c')
print("添加一个字符元素后各元素id:")
for i in range(len(a)):
    print(id(a[i]))

输出

原始的各元素id:
8791254619168
30906720
8791254619200
30905040
添加一个整型元素后各元素id:
8791254619168
30906720
8791254619200
30905040
8791254619232
添加一个字符元素后各元素id:
8791254619168
30906720
8791254619200
30905040
8791254619232
30771888

        我们可以看到 1, 2, 3 id分别是8791254619168,8791254619200,8791254619232,满足之前说的向后移动添加的值 - 原列表最后一个同型元素的值 这儿修正为原列表最后一个同型元素的值

但是字符型的元素就完全没规律可言,而且字符型的每次运行的 id 还不一样,所以我蒙了

a = [1.0,2.0,3.0]
print("原始的各元素id:")
for i in range(len(a)):
    print(id(a[i]))

a.append(4.0)
print("添加一个浮点型元素后各元素id:")
for i in range(len(a)):
    print(id(a[i]))

输出

原始的各元素id:
3518800
3519208
3518848
添加一个浮点型元素后各元素id:
3518800
3519208
3518848
3519280

第二次运行

原始的各元素id:
29995344
29995752
29995392
添加一个浮点型元素后各元素id:
29995344
29995752
29995392
29995824

浮点型的也不行,每次运行的 id 也是变化的,整型的多次运行都是一个 id 。

整型的

a = [1,2,3]
print("原始的各元素id:")
for i in range(len(a)):
    print(id(a[i]))

a.append(4)
print("添加一个浮点型元素后各元素id:")
for i in range(len(a)):
    print(id(a[i]))

第一次运行

原始的各元素id:
8791254619168
8791254619200
8791254619232
添加一个浮点型元素后各元素id:
8791254619168
8791254619200
8791254619232
8791254619264

第二次运行

原始的各元素id:
8791254619168
8791254619200
8791254619232
添加一个浮点型元素后各元素id:
8791254619168
8791254619200
8791254619232
8791254619264

       那么,电脑是怎么知道我的 整型是放的这么固定的一个地方呢,还保证 a 和 a+10 之间刚好够放它俩中间的10个整型数据

       感觉就好像整型从某个位置 8791254619168(这个位置放1) 一直排到后面都固定好了一样,那么是不是 Python里面 从 -2147483648 - 2147483647 这么多个整型数都能已经安排好了(这两个数是无符号4字节整数的最大值和最小值),python是不是用一个整数缓冲池缓存了某个指定范围的整数

       不过每次我关掉vscode 从新打开,1的 id 不一样 比如昨晚的是 8791490614304 ,今天的是 8791254619168。昨晚的可以看开头提到的上一篇文章,是不是在第一次运行的时候就固定初始化 -2147483648 - 2147483647之间的数的 id 了啊,我感觉每次打开 vscode 的第一次运行代码时间都比较长(也有可能是初始化路径啥的)。

       我想个办法从 id 获得值。来测试一下,看看我在程序里面初始化 a = [1,2,3,4],然后我取最后一个元素(4)的 id 加 32 位 ,把这个 id 的值取出来看看是不是 5

       浮点数和字符,以及字符串每次运行都不一样,是不是说明是在运行时动态分配内存存放的,

已经解决了

        python里面id()函数可以从变量名获得地址,那么怎么从地址(id)获得地址对应的值呢

        探究 python 是不是用了一个整数缓冲池缓存了指定范围的整数

       证明了 python 的确是用了一个整数缓冲池缓存了指定范围的整数,范围是 -5 — 256

                                        运行环境 Python3.7.0、vscode