繁体   English   中英

Python如何知道在memory中使用相同的object?

[英]How does Python know to use the same object in memory?

提示:本站提供中英文对照查看,鼠标放在中文字句上可显示英文原文。 若本文未解决您的问题,推荐您尝试使用帮您解决。

如果我使用以下内容:

a = 1000
print(id(a))

myList = [a,2000,3000,4000]
print(id(myList[0]))

# prints the same IDs

我得到相同的ID。 这对我来说很有意义。 我可以理解 memory 经理如何将相同的 object 分配给这些变量,因为我直接引用a列表中的 a。

但是,如果我这样做:

a = 1000
print(id(a))

myList = [1000,2000,3000,4000]
print(id(myList[0]))

# prints the same IDs

对于这两个打印件,我仍然得到相同的 ID output。 Python 如何知道对这些分配使用相同的 object? 寻找前世肯定是非常低效的,所以我假设这里发生了一些更聪明的事情。

我的第一个想法是与 integer 本身有关,用于计算对象地址,但该行为也适用于字符串:

a = "car"
print(id(a))

myList = ["car",2000,3000,4000]
print(id(myList[0]))

# prints the same IDs

但是,该行为并不适用于列表元素:

a = [1,2,3]
print(id(a))

myList = [[1,2,3],2000,3000,4000]
print(id(myList[0]))

# prints different IDs

有人可以解释我看到的行为吗?

编辑 - 我遇到过对于 -5 到 256 之间的小值,可以使用相同的 object。 问题是我看到相同的 object 仍然被用于巨大的值,甚至是字符串:

a = 1000000000000
myList = [1000000000000,1000,2000]
print(a is myList[0])
# outputs True!

我的问题是Python 在这些情况下如何在不搜索预先存在的情况下得出它是相同的 object? 让我们具体说CPython

编辑 - 我正在使用 Python V3.8.10

在 Python 中,像数字和短字符串这样的小而不变的值在计算机的 memory 中只存储一次(除非使用运算符来生成它们,这样会为此创建一个新的 object)以节省空间并加快程序速度。 这个过程称为“实习”。 这意味着当您多次写入相同的值时,它将具有相同的 memory 地址(id),并且您将对该值的每个实例获得相同的 id。 但是,列表和其他更复杂的数据类型不会被保留,因此每次使用列表时,都会为其分配一个新的 memory 空间,赋予它不同的 id。

问题未解决?试试使用:帮您解决问题。
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2023 STACKOOM.COM