Python 中列表的内存地址如何工作?

How memory address of list in Python work?

简单代码

c=[1]
print (c is [1])
#return false while if c = 1 integer then it would be true

我查了一下id然后就出来了

print(id([1]))
print(id([2]))
print(id([1,2,3]))
print(id(c))
#2523446278656 same id but diffrent from id(c)
#2523446278656 same id
#2523446278656 same id
#2523446278848

所有该死的列表值都具有相同的 ID?? (现在我明白了,每次我调用打印函数时,id 都会被重置)

当我只添加一个简单的代码时

d=c[:]

除 id(c) 外,所有 id 都发生了神奇的变化,id(d) 也指向上面的 id([1])

print(id([1]))
print(id([2]))
print(id([1,2,3]))
print(id(c))
print(id(d))
#2523446278592 diffrent id than aboved
#2523446278592 diffrent id than aboved
#2523446278592 diffrent id than aboved
#2523446278848 the same id as id(c) aboved
#2523446278656 now id(d) is somehow the same with id[1],[1,2],[1,2,3] above

请注意,如果我只是输入 'c[:]' 而不是 'd=c[:]',它们仍然是相同的 ID。另外,我上面的整个代码都在同一个脚本上并执行了一次。

为重新获得请求权限而编辑:现在我明白了 Python 中有一个垃圾收集器,每次我将值赋给一个变量时,垃圾收集器都会来取走旧的 id,然后下次我分配它会再次使用那个 id

[1]并不总是存在于2523446278592(例如)内存一直在分配和重新分配。因此,对于 print(id([1])) 它将 [1] 分配给一个 id,以便可以对其进行评估、存储等,但是在该行中使用它之后不再需要它,因此 space 在2523446278592 现在再次空闲,所以下一行 print(id([2])) 现在可以将 [2] 分配给 id 2523446278592,因为它是空的。但是,print(id(c)) 不使用 2523446278592(尽管它可用),因为 c 已经存储在不同的位置(而是打印)。然后,由于 d = c[:] 创建了一个新列表(不在 id(c)),它可以使用由 2523446278592.

表示的开放 space

但也要注意这里的区别:

c = [1]
print(id([1]))
print(id([2]))
print(id([1,2,3]))
print(id(c))
d = c[:]
print(id(d))

如您所说打印,因为 d 占用下一个空闲 ID(打印后释放的 on)

鉴于:

c = [1]
d = c[:]
print(id([1]))
print(id([2]))
print(id([1,2,3]))
print(id(c))
print(id(d))

它的工作方式不同,因为 d 是在打印之前分配的,所以打印行不能将 d 的 id 用于 [1] 等,因为它不是免费的,所以它是不同的.本例输出为:

2346573042880
2346573042880
2346573042880
2346568705216
2346568705408 #d is different from the print lines

欢迎来到临时对象的世界!当您编写 c == [1] 时,您 创建 一个新的列表对象 ([1]) 并设置一个 reference (c) 在上面。对象的生命周期将是其最后一次引用的生命周期。

但是当你写 id([1]) 时,你确实创建了一个新对象(因此有一个不同的 id),但是没有设置任何引用来保持它的活动,所以它会立即被销毁并且它的地址可用于下一个创建的对象。 ..

顺便说一句,d = c 你在同一个对象上创建了一个新的引用,因此它们将具有相同的 ID。

最后但并非最不重要的一点是,解释器管理其内存和对象 ID 的方式仅取决于实现细节,您甚至不应该尝试猜测它...并且肯定 永远不会 依赖任何模式!