我检查了雪人的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.
我怎么理解?
答案 0 :(得分:3)
首先,Python是一种动态类型化的语言,所有对象都带有类型信息。在C语言中,一个int仅需要字节来表示该int。在代码中隐含了它是一个int的知识。自从采用PEP 393以来,Python变得更加复杂,在Python中不是这样,数字中没有,尤其是字符串中没有。如您所见,在PEP和CPython源here中,Python都可以用几种表示形式之一表示字符串。不幸的是,报头信息很大。一个字符串不仅具有每个Python对象都具有的标头,还具有一个标志结构,它包含其哈希值,其字节长度,其真实长度等,并且是洋葱状的结构,其层数越多,复杂度就越高。表示。因此,仅ASCII字符串比较起来比较短(PyASCIIObject
);但是包含ASCII范围之外的字符的字符串将得到一个新层(PyCompactUnicodeObject
)。 sys.getsizeof
不仅会给您字符串长度;它为您提供了为对象分配的全部内存,包括标题信息,并且相加。