以下内容我能理解:
>>> [] is []
False
考虑到列表是可变的,我期望每次在表达式中出现[]
时,它都会成为一个新的空列表对象。然而,使用这个解释,下面的结果让我感到惊讶:
id([]) == id([])
True
为什么?这是什么解释?
以下内容我能理解:
>>> [] is []
False
考虑到列表是可变的,我期望每次在表达式中出现[]
时,它都会成为一个新的空列表对象。然而,使用这个解释,下面的结果让我感到惊讶:
id([]) == id([])
True
为什么?这是什么解释?
[]
并不是[]
,这是因为列表是可变的。如果它们不可变,则可以安全地映射到相同的列表而不会有问题。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
函数后立即被丢弃。
def f(x, y): return id(x) == id(y)
中,当 x
和 y
都需要保持存活时,f([], [])
的计算结果为 False
。 - Loax
id([]) == id([])
都不是True
(是的,我已经检查过了)。cPython倾向于以这种方式重新分配内存,这是一种实现细节。 - roippia = []; b = []; id(a) == id(b) # 这是False
- Silas Ray