我刚写了这样的代码:
li = [1, 2, 3, 4, 5]
for ele in li:
print "value: ", id(ele)
我得到了结果:
价值:21381944 1
价值:21381920 2
价值:21381896 3
价值:21381872 4
价值:21381848 5
每个元素分配24个字节,但我不明白为什么每个元素的地址减少而不是增加。
答案 0 :(得分:1)
这些是引用对象的内存地址。你不能从他们那里推断出关于物品的任何东西。大小
这些可以按任何特定顺序排列。它们甚至可能是非连续的。
使用-5到256范围内的整数进行此实验可能会产生误导,因为Python会在此范围内缓存整数。
让我们用任意对象测试它:
class A: pass
i = [A(), A(), A()]
for ele in li:
print("value: ", id(ele))
# value: 36309936
# value: 36310000
# value: 36310032
显然,每个A
实例在内存中的大小都相同,但第一个和第二个ID之间的差异为64,但第二个和最后一个之间的差异为32。
让我们再次使用另一个A
实例运行它:
li = [A(), A(), A(), A()]
for ele in li:
print("value: ", id(ele))
# value: 36441008
# value: 36441072
# value: 36441104
# value: 36472912
第一个和第二个之间为64,第二个和第三个之间为32,第三个和第四个之间为31808。
您可以根据需要随意使用:
li = [A(), A(), A(), A(), A(), A(), A(), A(), A(), A(), A(), A()]
for e1, e2 in zip(li, li[1:]):
print(abs(id(e1) - id(e2)))
# 192
# 32
# 32
# 32
# 44093952
# 2524224
# 2551328
# 15147712
# 64
# 128
# 32
通过使用this one等内存可视化工具,可以显示列表是对象引用列表而不是对象列表的想法。