查看以下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。为什么会这样?
答案 0 :(得分:3)
这是一个有趣的问题,但在wtfpython中有很好的解释。
在同一行中将a和b设置为“ hello”时,Python解释器将创建一个新对象,然后同时引用第二个变量。如果您在单独的行上执行此操作,则它不会“知道”
hello
已经作为对象(因为根据上述事实,“ hello”并未隐式地插入)。这是编译器的优化,特别适用于交互式环境。
不同之处在于,在IPython中,它可能与直接Python REPL有所不同,因此这解释了前两个输入中id
的不同。
答案 1 :(得分:1)
两个不重叠生命周期的对象可能具有相同的id()值。