我对以下结果感到惊讶,使用Python 2.7.4
:
>>> id(5)
5068376
>>> id(5)
5068376
当评估表达式5时,创建一个具有5068376标识的新对象。现在,我希望重复相同的语句将创建另一个新对象,其身份将是唯一的,因为简单地评估表达式不会产生对该对象的任何引用,并且该对象应该被垃圾收集。
并不是解释器重用相同的内存地址:
>>> id(6)
5068364
>>> id(5)
5068376
那是什么给出的?解释器是否对文字进行幕后绑定?
答案 0 :(得分:5)
在Python中有一系列小数字作为单例保存;任何引用都将返回相同的对象,它们永远不会被垃圾回收。
>>> for x,y in enumerate(range(1000)):
if x is not y:
print x,y
break
257 257
答案 1 :(得分:3)
这里有两件事:
小型Python整数(从-5到256)包含 interned ;将文字整数转换为相同数字的完全相同的对象。对于这些整数,他们id()
将保持不变。
id()
仅在对象的生命周期内是唯一的;如果第一个对象再次被清除,它可以在以后重用另一个对象。您不会将文字存储在任何位置,因此可以再次重复使用 的内存地址:
>>> id('foo bar')
4572936304
>>> id('bar baz')
4572936304
此处'foo bar'
和'bar baz'
是两个不同的对象,但它们的生命周期不重叠。第一个创建,传递给id()
函数,然后再次销毁。然后创建第二个字符串,传递给id()
并依次销毁。