垃圾收集器如何在python中跟踪其引用?

垃圾收集器如何在python中跟踪其引用?,python,Python,在使用数字和字符串分析id内置行为时,我感到困惑 x = 100 y = x # x and y both points to same object that is 100 id(x) 162569156 id(y) 162569156 现在,我尝试更改x指向的对象 x = 200 # since x points to different objects & garbage collector increments reference counts as its no lon

在使用数字和字符串分析id内置行为时,我感到困惑

x = 100
y = x   # x and y both points to same object that is 100
id(x)
162569156
id(y)
162569156
现在,我尝试更改x指向的对象

 x = 200 # since x points to different objects & garbage collector increments reference counts as its no longer points to old objects 
 id(y)
 162569156
 id(x)   # its different 
 162569932
现在我了解了python垃圾收集器,它是引用计数垃圾收集器,当x=200或引用数改变时,它会将其清除。 这是我的疑问,从上面的观点来看,我是否可以假设,每当我再次执行x=100,即试图指向旧对象时,id将始终给出与先前完全相同的内存位置

x = 100 #making x to points to same old object
id(x)
162569156  #getting same old location
id(y)
162569156
若以上是真的,那个么这是否意味着对于每一个数以百万计的引用,都会有一个引用,并且id在将来指向旧对象时给出相同的位置


我有这个疑问,就像在C语言中一样,一旦指针失去了地址堆,就不能保证下次执行malloc时它会得到相同的地址。

对于小值,python总是创建一个id,并存储创建的id,而创建的相同值只是将该id分配给变量

Python缓存[-5256]范围内的整数,因此 该范围内的整数也相同

我只是想展示一些大整数的演示

In [9]: x=1000

In [10]: x=y

In [11]: id(x)
Out[11]: 20359984

In [12]: id(y)
Out[12]: 20359984

In [13]: x=1001

In [14]: id(x)
Out[14]: 20360056

In [15]: x=1000 # again assigning to x to 1000

In [16]: id(x)
Out[16]: 19649168 # id got differs because python normally does not keep reference for large ints

Python不能保证这一点。你会感到困惑,因为1100足够小,它永久地存在于实现细节的小整数缓存中,而2你太相信实验的推断了。好的。那么python如何区分或维护大小对象的引用计数。@user2357112我的意思是,当x指向不同的对象时,垃圾收集器所做的是不查看任何引用,我怀疑id如何返回相同的内存位置(如果较小)或不同的内存位置(如果较大)?id是否执行所有这些操作,如计算长度或垃圾收集器有其他条目来处理这些操作。当您尝试创建新的整数对象时,它会测试该值以查看该值是否位于小整数缓存中,如果是,它只会分配先前存在的对象。不需要对这些缓存对象进行引用计数,因为它们永远不会被销毁。所有这些都是可更改的实现细节,不会对任何程序的运行产生实质性影响。感谢@MarkRansom的精彩解释,这是否意味着对于所有缓存对象,都是较小的一个,我仍然不清楚python如何区分引用。在x=1000和idx之间执行x=y的事实有点破坏了您的大型int演示。抱歉,我没有理解u@user2357112你能把答案修改一下吗effective@user2357112如果同样的问题被问到,你为什么不回答我是如何用x=y破坏代码的
In [9]: x=1000

In [10]: x=y

In [11]: id(x)
Out[11]: 20359984

In [12]: id(y)
Out[12]: 20359984

In [13]: x=1001

In [14]: id(x)
Out[14]: 20360056

In [15]: x=1000 # again assigning to x to 1000

In [16]: id(x)
Out[16]: 19649168 # id got differs because python normally does not keep reference for large ints