Python中Set对象的ID分配异常:为何重复生成相同对象ID?
Python中多次创建空set却重复出现相同对象ID的原因
你观察到的现象是:在Python交互式环境中多次调用set()创建空集合时,返回的对象ID只有两个,交替重复出现。
演示示例
Python 3.9.9 (main, Nov 21 2021, 03:23:42) [Clang 13.0.0 (clang-1300.0.29.3)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> id(set()) 4349096672 >>> id(set()) 4349096448 >>> id(set()) 4349096672 >>> id(set()) 4349096448 >>> id(set()) 4349096672
成因解析
这个现象的核心是临时对象的内存复用机制:
- 当你执行
id(set())时,set()创建的空集合是一个无引用的临时对象——它没有被任何变量保存,一旦id()函数执行完毕,这个对象就失去了所有引用,会被Python的垃圾回收器立即标记为可回收。 - Python的内存分配器会优先复用刚回收的内存块(尤其是大小完全匹配的内存)。因为每次创建的空集合占用的内存大小完全一致,所以分配器会交替把之前回收的两块内存重新分配给新创建的空集合,导致新对象的ID和之前被回收的对象ID重复。
如果把集合赋值给变量,让对象保持引用,就不会出现ID重复的情况:
>>> s1 = set() >>> s2 = set() >>> s3 = set() >>> print(id(s1), id(s2), id(s3)) 4349097056 4349096992 4349096928 # 三个ID完全不同
此时对象被变量引用,不会被立即回收,内存也就不会被复用。
内容的提问来源于stack exchange,提问作者Igor
相关产品推荐
相关产品推荐

