为什么Python中的空字符串有时占用49个字节,有时占用51个字节?

2024-05-23 20:32:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我在三个环境中测试了sys.getsize('')sys.getsize(' '),在其中两个环境中sys.getsize('')给出了51个字节(比第二个多一个字节)而不是49个字节:

截图:

Win8+Spyder+CPython 3.6版本:

sys.getsizeof('') == 49 and sys.getsizeof(' ') == 50

Win8+Spyder+IPython 3.6版:

sys.getsizeof('') == 51 and sys.getsizeof(' ') == 50

Win10(VPN远程)+PyCharm+CPython 3.7:

sys.getsizeof('') == 51 and sys.getsizeof(' ') == 50

第一次编辑

我在Python.exe中做了第二个测试,而不是Spyder和PyCharm(这两个仍然显示51),一切看起来都很好。显然我没有解决这个问题的专业知识,所以我把它留给你们:)

Win10+Python3.7控制台与使用相同解释器的PyCharm相比:

enter image description here

使用相同解释器的Win8+IPython 3.6+Spyder:

enter image description here


Tags: 版本编辑字节远程环境ipythonsysvpn
2条回答

https://docs.python.org/3.5/library/sys.html#sys.getsizeof

sys是特定于系统的,因此很容易区分。这常常被每个人忽视。python中所有特定于系统的东西都已经在sys包中转储多年了。例如,根据定义,sys.getwindowsversion()是不可移植的,但它是存在的。它就像是跨平台编码的完美世界中被拒绝的无底深渊。你看到的是一个有趣的Python掘金。

来自getsizeof文档:

Only the memory consumption directly attributed to the object is accounted for, not the memory consumption of objects it refers to. getsizeof() calls the object’s __sizeof__ method and adds an additional garbage collector overhead if the object is managed by the garbage collector.

当使用垃圾回收时,操作系统将添加这些额外的位。如果您阅读了Python和GC Q&AWhen are objects garbage collected in python?,那么人们已经深入到了极其详细的内容中,阐述了GC以及它将如何影响内存/引用计数和位blah blah。

我希望这能解释这是从哪里来的。如果您不使用system级别的属性,而是使用更多的pythonic属性,那么您将获得一致的大小。

这听起来像是在检索字符串对象的wchar表示。从CPython 3.7开始,按照CPython Unicode表示的工作方式,空字符串通常存储在“compact ASCII”表示中,64位构建的压缩ASCII字符串的基础数据和填充可以工作到48个字节,加上一个字节的字符串数据(只有空终止符)。您可以看到相关的头文件here

目前(这是4.0中的scheduled for removal),还可以选择检索字符串的wchar\u t表示。在具有2字节wchar_t的平台上,空字符串的wchar表示为2字节(再次为空终止符)。wchar表示在第一次访问时缓存在字符串上,并且str.__sizeof__在该额外数据存在时会对其进行解释,从而产生总共51字节的结果。

相关问题 更多 >