【问题标题】:Two bytes snowman return 76 bytes per sys.getsizeof() [duplicate]两个字节雪人每个 sys.getsizeof() 返回 76 个字节 [重复]
【发布时间】:2025-11-29 15:40:01
【问题描述】:

我检查了雪人的 unicode

In [37]: snowman = "\u2603"
In [38]: snowman
Out[38]: '☃'

如上,'☃'占用2个字节

但是,当我尝试获取它的大小时:

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

表示雪人占用76字节

关于模块sys中的内置函数getsizeof的帮助:

getsizeof(...)
    getsizeof(object, default) -> int

    Return the size of object in bytes.

我怎么理解?

【问题讨论】:

    标签: python


    【解决方案1】:

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

    【讨论】:

      最近更新 更多