懵了兄弟们, Python 中的空列表到底是个什么玩意

2022-08-30 20:11:47 +08:00
 Yuan2One

a = [] b = [] print(id(a)) print(id(b)) 可变对象,输出的相同的,可以理解

不懂的地方来了,我直接 print(id([])) print(id([])) 输出的是一样的

但是在第一句打个断点,然后再输出第二句 print(id([])) debug print(id([])) 输出的就不一样了

有大佬可以解惑一下吗

2609 次点击
所在节点    Python
9 条回复
lisongeee
2022-08-30 20:33:41 +08:00
lisongeee
2022-08-30 20:35:17 +08:00
jiangpranay
2022-08-30 20:49:58 +08:00
楼上正解。 对象的赋值是引用计数,对象本身 id 一般不一样。
penguinWWY
2022-08-30 21:01:11 +08:00
list 生命周期结束的时候会调用 list_dealloc 函数,但并不会立即释放内存。而是存放在对应的 free list 中,如果有新的大小合适的 list 生成则会直接使用,减少内存分配和释放的消耗。

print(id([])); print(id([]))

两次分配的 list 是同一个指针,所以 id 相同。debug 模式是通过 trace 实现的,中间有别的 list 生成(或释放),所以没有使用到同一个指针,id 不同
baleeny
2022-08-30 21:08:37 +08:00
所以为什么`a = [] b = [] print(id(a)) print(id(b)) 可变对象,输出的相同的,可以理解`这个是输出相同的呢,按上面的解释这个不应该相同啊。。
sunrisewestern
2022-08-30 21:33:18 +08:00
@baleeny 因为输出其实不相同。看 2 楼的结果
takato
2022-08-31 04:24:42 +08:00
@baleeny 因为本来就是不一样的。
```
>>> a = []
>>> b = []
>>> print(id(a))
1936663141056
>>> print(id(b))
1936663489728
```
meiyoumingzi6
2022-08-31 10:21:18 +08:00
你打开了一瓶矿泉水
我打开了一瓶矿泉水

你喝完了
我也喝完了

现在有人吧两个瓶子混到一块了
虽然他们看起来一样
但是那就是两个瓶子啊

另外,跟断点没的关系
Yuan2One
2022-08-31 10:29:01 +08:00
@lisongeee 是的,但是没解答为啥 debug 会不一样

@penguinWWY 多谢,看起来是正确的解释!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/876553

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX