【问题标题】:Why and how does the Python interpreter remember literal objects [duplicate]Python解释器为什么以及如何记住文字对象[重复]
【发布时间】:2013-04-18 09:40:23
【问题描述】:

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

>>> id(5)
5068376

>>> id(5)
5068376

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

也不是解释器重用了同一个内存地址:

>>> id(6)
5068364

>>> id(5)
5068376

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

【问题讨论】:

  • @AshwiniChaudhary:您可能想总结一下并作为答案发布,因为这回答了问题。
  • @Guvante:他为什么要这么做?投票结束重复是正确的做法。无需在此处重新表述另一个问题的现有答案。
  • @Wooble:因为虽然答案相同,但我无法判断问题是否相同。我不认识 idis,所以不想声称重复。

标签: python literals name-binding


【解决方案1】:

在 Python 中有一系列小数字作为单例保存;任何引用都将始终返回相同的对象,并且它们永远不会被垃圾回收。

>>> for x,y in enumerate(range(1000)):
    if x is not y:
        print x,y
        break

257 257

【讨论】:

  • 澄清一下,这样做的原因是因为否则会对像 1+2 这样的东西造成非常大的性能影响
  • 知道了,感谢您的快速回复。 Python 数据模型文档中确实应该提到这一点。
  • @Sharp3,这是一个实现细节,可能随时更改。你真的不应该关心你是否得到相同的对象。
  • 恭喜你突破了 100K! :-)
  • @MartijnPieters,谢谢!并祝贺你打败了我!
【解决方案2】:

这里有两件事:

  • 小 Python 整数(从 -5 到 256 包括在内)是interned;文字整数被翻译成相同数字的完全相同的对象。对于这些整数,它们的id() 将保持不变。

  • id() 仅在对象的生命周期内是唯一的;如果第一个对象已被再次清除,则可以稍后将其重新用于另一个对象。您不会将文字存储在任何地方,因此内存地址 可以再次重复使用:

    >>> id('foo bar')
    4572936304
    >>> id('bar baz')
    4572936304
    

    这里'foo bar''bar baz' 是两个不同的对象,但它们的生命周期不重叠。第一个被创建,传递给id() 函数,然后再次销毁。然后创建第二个字符串,传递给id(),然后依次销毁。

【讨论】:

    猜你喜欢
    • 2014-02-26
    • 1970-01-01
    • 2012-04-30
    • 2022-06-20
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    相关资源
    最近更新 更多