Python解释器为什么以及如何记住文字对象

时间:2013-04-24 17:43:00

标签: python literals name-binding

我对以下结果感到惊讶,使用Python 2.7.4

>>> id(5)
5068376

>>> id(5)
5068376

当评估表达式5时,创建一个具有5068376标识的新对象。现在,我希望重复相同的语句将创建另一个新对象,其身份将是唯一的,因为简单地评估表达式不会产生对该对象的任何引用,并且该对象应该被垃圾收集。

并不是解释器重用相同的内存地址:

>>> id(6)
5068364

>>> id(5)
5068376

那是什么给出的?解释器是否对文字进行幕后绑定?

2 个答案:

答案 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()并依次销毁。