2014-02-22 57 views
14

下对我来说很有意义:Python何时为空列表创建新的列表对象?

>>> [] is [] 
False 

由于列表是可变的,我希望[]每出现在一个表达式时是一个新的空列表对象。然而,使用这个解释,我惊奇地发现:

id([]) == id([]) 
True 

为什么?什么是解释?

+0

我会打赌一些非零金额的'id([])== id([])'不是所有风格的python'真'。 (是的,检查。)cPython倾向于以这种方式重新分配内存,它是一个实现细节。 – roippi

+0

@roippi我认为这实际上是一种快速的malloc/free/malloc。 'a = []; b = []; id(a)== id(b)#This is False' –

+0

@roippi - 我敢打赌,有些Python的味道有时并不适用于其他人,具体取决于GC的运行时间。 – Malvolio

回答

12

在第一个例子,[][]正是因为列表是可变的。如果他们不是,他们可以安全地映射到同一个没有问题。

在第二个示例中,id([])创建一个列表,获取该id并取消分配列表。第二次创建列表再次,但“放在同一个地方”,因为没有什么别的事情发生过。 id对象的寿命期间是唯一有效的,并且在这种情况下,其寿命几乎是零

docs on id

这是被保证是唯一的和常数的整数(或长整数)这个对象在其一生中。具有非重叠生命周期的两个对象可能具有相同的id()值。


评论拆卸:

0 LOAD_GLOBAL    0 (id) # load the id function 
    3 BUILD_LIST    0   # create the first list 
    6 CALL_FUNCTION   1   # get the id 
    9 LOAD_GLOBAL    0 (id) # load the id function 
    12 BUILD_LIST    0   # create the second list 
    15 CALL_FUNCTION   1   # get the id 
    18 COMPARE_OP    2 (==) # compare the two ids 
    21 RETURN_VALUE      # return the comparison 

注意没有STORE_FAST,保留列表。因此它在传递到id函数后立即被丢弃。

+0

我记得你回答同样的问题前不久; P – zhangxaochen

+0

不是这一个,也许它不是你,但必须是一个重复 – zhangxaochen

+1

很好回答。例如,在def f(x,y)中:return id(x)== id(y)''''x'和'y'必须保持活着,'f([],[])'评估为'FALSE'。 – Loax