下对我来说很有意义:Python何时为空列表创建新的列表对象?
>>> [] is []
False
由于列表是可变的,我希望[]
每出现在一个表达式时是一个新的空列表对象。然而,使用这个解释,我惊奇地发现:
id([]) == id([])
True
为什么?什么是解释?
下对我来说很有意义:Python何时为空列表创建新的列表对象?
>>> [] is []
False
由于列表是可变的,我希望[]
每出现在一个表达式时是一个新的空列表对象。然而,使用这个解释,我惊奇地发现:
id([]) == id([])
True
为什么?什么是解释?
在第一个例子,[]
不[]
正是因为的列表是可变的。如果他们不是,他们可以安全地映射到同一个没有问题。
在第二个示例中,id([])
创建一个列表,获取该id并取消分配列表。第二次创建列表再次,但“放在同一个地方”,因为没有什么别的事情发生过。 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
函数后立即被丢弃。
我记得你回答同样的问题前不久; P – zhangxaochen
不是这一个,也许它不是你,但必须是一个重复 – zhangxaochen
很好回答。例如,在def f(x,y)中:return id(x)== id(y)''''x'和'y'必须保持活着,'f([],[])'评估为'FALSE'。 – Loax
我会打赌一些非零金额的'id([])== id([])'不是所有风格的python'真'。 (是的,检查。)cPython倾向于以这种方式重新分配内存,它是一个实现细节。 – roippi
@roippi我认为这实际上是一种快速的malloc/free/malloc。 'a = []; b = []; id(a)== id(b)#This is False' –
@roippi - 我敢打赌,有些Python的味道有时并不适用于其他人,具体取决于GC的运行时间。 – Malvolio