为什么在同一行创建的两个对象具有相同的对象,但这与列表不同?

问题描述:

在下面的代码A和B都具有相同的ID为什么在同一行创建的两个对象具有相同的对象,但这与列表不同?

>>> a,b=470,470 
>>> id(a) 
32404032 
>>> id(b) 
32404032 

但不是在这里,

>>> a = 470 
>>> b = 470 
>>> id(a) 
32403864 
>>> id(b) 
32344636 

并且如果在同一行中创建然后给予不同的ID

>>> a,b=[1,2], [1,2] 
>>> id(a) 
32086056 
>>> id(b) 
32653960 
>>> 
同一个列表对象

为什么在同一行上创建的相同整数的变量具有相同的ID,但是在不同行上创建的时候不是这样,这与列表不同。

是的,对于不可变的对象编译器将创建常量并重新使用它们。但是,您不能为列表等可变对象执行此操作,因为如果您通过一个引用或另一个引用进行更改,则会操纵同一对象。

您可以通过查看代码对象的co_consts属性来提取常量;得到其中的一个最简单的方法是使用compile()功能:

>>> compile("a,b=470,470", '', 'single').co_consts 
(470, None, (470, 470)) 

在交互式解释,单独的线路分别编译,所以有独立常数。在一个单独的Python脚本中,每个范围都有自己的常量,允许更广泛的共享。在交互式解释,创建一个函数或类来获得一个单独的范围与自己的常量:

>>> def foo(): 
...  a = 470 
...  b = 470 
...  return id(a) == id(b) 
... 
>>> foo() 
True 
>>> foo_code = compile('''\ 
... def foo(): 
...  a = 470 
...  b = 470 
...  return id(a) == id(b) 
... ''', '', 'single') 
>>> foo_code = compile(''' 
... def foo(): 
...  a = 470 
...  b = 470 
...  return id(a) == id(b) 
... ''', '', 'single') 
>>> foo_code.co_consts 
(<code object foo at 0x1018787b0, file "", line 2>, None) 
>>> foo_code.co_consts[0].co_consts # constants for the foo function code object 
(None, 470) 

这些实施细则(最佳化),你不应该依靠他们。