Python是否为元组取消了内存?

use*_*262 2 python memory-management

好吧,错误几乎肯定是我的,而不是Python,但我遇到了一些代码,可以用来显示为各种变量分配了多少内存,并看到了令人费解的结果.代码如下:

import sys

def show_sizeof(x, level=0):

    print "\t" * level, x.__class__, sys.getsizeof(x), x

    if hasattr(x, '__iter__'):
        if hasattr(x, 'items'):
            for xx in x.items():
                show_sizeof(xx, level + 1)
        else:
            for xx in x:
                show_sizeof(xx, level + 1)
Run Code Online (Sandbox Code Playgroud)

它似乎接受一个变量,然后返回它的类,为它分配的内存量及其值.如果对象是可迭代的,则此方法以递归方式调用该可迭代的所有成员.

现在当我尝试这个(在我的64位机器上):

>>> show_sizeof(('a', 213))
 <type 'tuple'> 72 ('a', 213)
    <type 'str'> 38 a
    <type 'int'> 24 213
Run Code Online (Sandbox Code Playgroud)

我看到为我的元组分配了72个字节,只使用了62(= 38 + 24).这是有道理的.但是,当我向我的元组添加另一个元素时,我看到了这个:

>>> show_sizeof(('a', 213, 1))
<type 'tuple'> 80 ('a', 213, 1)
     <type 'str'> 38 a
     <type 'int'> 24 213
     <type 'int'> 24 1
Run Code Online (Sandbox Code Playgroud)

元组使用80个字节,但其成员似乎需要86个字节(= 38 + 24 + 24).元组不应该至少需要86个字节???

Mar*_*ers 5

你误解了输出.sys.getsizeof()仅报告对象本身的内存使用,从不报告它引用的任何对象.

元组对象由指向其他对象指针组成.整个元组,包括那些指针,占用了72个字节.那些指针是对占用内存的对象的引用既不在这里也不在那里,那些对象本身不是元组内存占用的一部分.

请注意,Python可以重用引用.例如,对象只有一个副本None,但(None, None)元组仍然需要记录对该对象的两个引用.该元组仍然需要72个字节的内存:

>>> import sys
>>> sys.getsizeof((None, None))
72
>>> sys.getsizeof(None)
16
Run Code Online (Sandbox Code Playgroud)

(None, None)元组所需的总内存为72 + 16字节.其他容器可以引用该None对象,但这些对象不必包含那16个字节,只有内存空间来容纳足够的指针.