【发布时间】:2017-11-15 16:34:40
【问题描述】:
Python 的id() 函数返回对象的唯一标识符。所以当在我的终端中,我会做类似的事情:
>> a = 23
>> id(a)
28487496
现在,我知道 python 会跟踪创建的所有对象以及对该对象的引用次数,当值达到 0 时,该对象将被垃圾回收。
我想知道的是,当我这样做时会发生什么:
>> id(27)
28487498
我从未创建过值为 27 的对象,即我从未写过b=27,但我仍然以某种方式获得了一个唯一标识符。这是否意味着在内存中创建了一个对象?如果是,即使这样,也应该有 0 个对该对象的引用,并且它应该已经被垃圾回收了。
那么,什么时候真正在内存中创建对象?
如果我在某处错了,请告诉我。
我刚刚发现的另一个有趣的事情是:
>> a = 23
>> id(a)
28487496
>> id(20 + 3)
28487496
在这种情况下,Python 会记住对数字 23 的引用,Python 是如何做到这一点的?
【问题讨论】:
-
b = 27做了两个的事情,它创建了对象和分配。27仍然创建对象。 -
现在,对于小整数,有一个例外:那些是被实习的(每个都保留一个副本,出于性能和内存原因,它们不是新创建的),请参阅"is" operator behaves unexpectedly with integers
-
重要的是要注意,进行分配不是创建对象的原因。
-
-5 到 256 的整数(Py27 特定的)被缓存,所以它们是单调的,所以每次访问其中一个时,它都不会创建新对象,但从该缓存重定向到一个。
标签: python object garbage-collection cpython python-internals