a = [] b = [] print(id(a)) print(id(b)) 可变对象,输出的相同的,可以理解
不懂的地方来了,我直接 print(id([])) print(id([])) 输出的是一样的
但是在第一句打个断点,然后再输出第二句 print(id([])) debug print(id([])) 输出的就不一样了
有大佬可以解惑一下吗

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