
[英]How does Python know that an integer object was created before and gives the same reference (even for values > 256)?
[英]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.