a = [] b = [] print(id(a)) print(id(b)) 可变对象,输出的相同的,可以理解
不懂的地方来了,我直接 print(id([])) print(id([])) 输出的是一样的
但是在第一句打个断点,然后再输出第二句 print(id([])) debug print(id([])) 输出的就不一样了
有大佬可以解惑一下吗
1
lisongeee 2022-08-30 20:33:41 +08:00
|
2
lisongeee 2022-08-30 20:35:17 +08:00
|
3
jiangpranay 2022-08-30 20:49:58 +08:00
楼上正解。 对象的赋值是引用计数,对象本身 id 一般不一样。
|
4
penguinWWY 2022-08-30 21:01:11 +08:00 3
list 生命周期结束的时候会调用 list_dealloc 函数,但并不会立即释放内存。而是存放在对应的 free list 中,如果有新的大小合适的 list 生成则会直接使用,减少内存分配和释放的消耗。
print(id([])); print(id([])) 两次分配的 list 是同一个指针,所以 id 相同。debug 模式是通过 trace 实现的,中间有别的 list 生成(或释放),所以没有使用到同一个指针,id 不同 |
5
baleeny 2022-08-30 21:08:37 +08:00
所以为什么`a = [] b = [] print(id(a)) print(id(b)) 可变对象,输出的相同的,可以理解`这个是输出相同的呢,按上面的解释这个不应该相同啊。。
|
6
sunrisewestern 2022-08-30 21:33:18 +08:00
@baleeny 因为输出其实不相同。看 2 楼的结果
|
7
takato 2022-08-31 04:24:42 +08:00
@baleeny 因为本来就是不一样的。
``` >>> a = [] >>> b = [] >>> print(id(a)) 1936663141056 >>> print(id(b)) 1936663489728 ``` |
8
meiyoumingzi6 2022-08-31 10:21:18 +08:00 via iPhone
你打开了一瓶矿泉水
我打开了一瓶矿泉水 你喝完了 我也喝完了 现在有人吧两个瓶子混到一块了 虽然他们看起来一样 但是那就是两个瓶子啊 另外,跟断点没的关系 |
9
Yuan2One OP |