【问题标题】:Python: different objects get the same idPython:不同的对象获得相同的ID
【发布时间】:2019-01-21 15:27:19
【问题描述】:

查看以下 IPython (Python 3.7) 会话:

In [1]: id('hello')                                                     
Out[1]: 140300950123104

In [2]: id('hello')                                                     
Out[2]: 140300963300384

In [3]: 'hello' is 'hello'                                              
Out[3]: True

In [4]: '{} - {}'.format(id('hello'), id('hello'))                      
Out[4]: '140300946565808 - 140300946565808'

表达式 1 和 2 表示每次初始化字符串 hello 时,它确实获得了不同的 id。然而,当在同一个表达式中初始化时,它们似乎得到了与表达式 3 和 4 的结果相同的 id。为什么会这样?

【问题讨论】:

标签: python


【解决方案1】:

这是一个有趣的问题,但在 wtfpython 中有很好的解释。

当 a 和 b 在同一行中设置为“hello”时,Python 解释器会创建一个新对象,然后同时引用第二个变量。如果您在单独的行上执行此操作,则它不会“知道”已经有 hello 作为对象 (因为根据上述事实,“hello”并未隐式实习)。这是一个编译器优化,特别适用于交互环境。

不同之处在于,在 IPython 中,可能与直接 Python REPL 有所不同,因此这解释了前两个输入中 id 的差异。

【讨论】:

  • 我可以确认 python 的行为与 ipython 不同:python -c 'print(id("hello")); print(id("hello"))' -> 139863431234648 139863431234648
  • 如果你在 REPL 中输入 id('hello')'hello' 的生命周期就会立即结束,这就是为什么它下次可以接收到不同的 id。当两者同时存在时,将它们存储在同一内存中会更有效,在这种情况下它们会获得相同的 id。
【解决方案2】:

生命周期不重叠的两个对象可能具有相同的 id() 值。

【讨论】:

猜你喜欢
  • 2020-06-22
  • 2018-01-17
  • 2019-12-19
  • 2015-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多