Python:不同的对象获得相同的ID

时间:2019-01-21 15:27:20

标签: python

查看以下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。为什么会这样?

2 个答案:

答案 0 :(得分:3)

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

  

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

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

答案 1 :(得分:1)

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