7

我知道这del d[key]将删除键值对,而d[key]=None只会取消引用该值。

但是,在内存管理方面,有什么区别吗?None假设没有其他变量引用该值,设置值是否会立即触发垃圾回收?

我做了一个小实验:

In [74]: import sys
In [75]: a = {'a': 'blah'}

In [76]: sys.getsizeof(a)
Out[76]: 280

In [77]: a['a'] = None

In [79]: sys.getsizeof(a)
Out[79]: 280

In [80]: del a['a']

In [81]: sys.getsizeof(a)
Out[81]: 280

不确定该方法是否有效,但在字典的大小方面似乎完全没有区别。我必须在这里错过一些东西。

4

3 回答 3

9

sys.getsizeof测量字典本身的大小;不是它包含的值的大小。

None是一个对象。它需要一些内存。

要查找 dict的大小,包括它包含的值的大小,您可以使用pymler

In [26]: import pympler.asizeof as asizeof

In [27]: asizeof.asizeof({'a': None})
Out[27]: 168

In [28]: asizeof.asizeof({})
Out[28]: 136

In [29]: import sys

In [30]: 
In [31]: sys.getsizeof({})
Out[31]: 136

In [34]: sys.getsizeof({'a':None})
Out[34]: 136
于 2012-11-10T14:55:55.677 回答
2

unutbu 是正确的。但有时,python 垃圾收集器的吸收速度可能会有点慢。

对一个对象调用 del 并删除对该对象的所有引用意味着垃圾收集器可以在它准备好时收集它。这通常不会导致使用的内存量立即减少。

您可以使用 gc 模块强制收集并查看垃圾收集器实际看到的内容。

于 2012-11-10T15:02:02.130 回答
0

Python 字典在逻辑旁边包含指向所有键的指针和指向所有值的指针。

  • 将值设置为 None 会使字典中的对象数量保持不变,它将一个值指针替换为指向 None 对象的指针。如果不再从其他地方引用旧值对象,它将被垃圾回收。钥匙会留下来。
  • 删除一个值,如果这意味着不再引用键和/或值,将导致两者都被清理,并且原则上会减小字典本身的大小。字典是否真的会“缩小”是一个我不知道的实现细节。

在一个对象上进行测试可能不具有代表性。尝试一百万。此外,用一个短的“字符串”对象测试它可能不具有代表性,因为一个字符串可能是“内部的”,即它可能成为不可破坏的对象集的一部分,当解释器再次需要它时,这些对象会自动重用。

于 2012-11-10T15:51:57.037 回答