Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x python3-为什么字符串的大小大于encode_Python 3.x - Fatal编程技术网

Python 3.x python3-为什么字符串的大小大于encode

Python 3.x python3-为什么字符串的大小大于encode,python-3.x,Python 3.x,在Python3中,字符串的大小,如'test.\uuu sizeof\uu()返回73。但是,如果我将其编码为utf-8,'test'.encode()。\uuuu sizeof\uuuu()返回37 为什么字符串的大小明显大于utf-8中的编码大小?str与编码的字节对象不同,python 3中的字符串通常存储为16位整数而不是字节。这使得字符串的大小增加了一倍。可能还存在一些额外的元数据,使对象进一步膨胀。在CPython中,直到并包括3.2,unicode字符(在3.x中变为str字符)

在Python3中,字符串的大小,如
'test.\uuu sizeof\uu()
返回
73
。但是,如果我将其编码为utf-8,
'test'.encode()。\uuuu sizeof\uuuu()
返回
37


为什么字符串的大小明显大于utf-8中的编码大小?

str
与编码的
字节对象不同,python 3中的字符串通常存储为16位整数而不是字节。这使得字符串的大小增加了一倍。可能还存在一些额外的元数据,使对象进一步膨胀。

在CPython中,直到并包括3.2,unicode字符(在3.x中变为str字符)被存储为16位或32位无符号整数,具体取决于构建的是“窄”还是“宽”。(在Windows上总是很窄,都在linux上使用)。在3.3及后续版本中,CPython切换到灵活的字符串表示(FSR),根据字符串中“最宽”字符所需的宽度,每个字符使用1、2或4个字节(8、16或32位)。看

对于64位3.4.3,
'test.\uuu-sizeof\uuu==53
,而仍然是
b'test.\uuu-sizeof\uu==37
。由于两者都使用每个字符1个字节,因此在字符串对象中额外的16个字节是额外的开销。其中一部分是隐藏的规范,说明字符串是使用1、2还是4字节/字符。为便于比较,
'tes\u1111.\uuuuuuuuuuuuuuuuuuuuuuuuuof()==82
'tes\u0001111.\uuuuuuuuuuuuuof()==92


(不,我不知道为什么要跳转到82。可能需要检查代码才能确定。)

你知道在哪里可以找到有关此的文档吗?@uday
字节
非常简单,是一个字节序列。您可以在中找到一些有关
str
的有趣信息