关于python:两个字节的雪人每个sys.getsizeof()返回76个字节

Two bytes snowman return 76 bytes per sys.getsizeof()

本问题已经有最佳答案,请猛点这里访问。

我查了雪人的Unicode码

1
2
3
In [37]: snowman ="\u2603"
In [38]: snowman
Out[38]: '?'

如上所述,"?"占用2个字节

但是,当我试图得到它的尺寸时:

1
2
In [39]: sys.getsizeof(snowman)
Out[39]: 76

表示雪人取76字节

关于内置函数getsizeof in module sys的帮助:

1
2
3
4
getsizeof(...)
    getsizeof(object, default) -> int

    Return the size of object in bytes.

我怎么能理解?


首先,Python是一种动态类型语言,所有对象都携带类型信息。在C语言中,int只需要字节来表示int;它是int的知识在代码中是隐式的。在python中不是这样,在数字中不是这样,尤其是在字符串中,自从pep 393被采用以来,字符串变得更加复杂。如您所见,无论是在PEP中还是在这里的cpython源代码中,python都可以用几个表示中的一个表示字符串。不幸的是,头信息相当大;字符串不仅具有每个python对象所具有的头,而且还具有标志结构,它在具有更多层的洋葱状结构中携带散列、字节长度、真实长度等等,表示形式越复杂。因此,仅限ASCII的字符串比较短(PyASCIIObject;但是包含ASCII范围之外的字符的字符串将得到一个新的层(PyCompactUnicodeObject)。sys.getsizeof不仅提供字符串长度,还提供了为对象分配的全部内存,包括头信息,并将其相加。