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

Nic*_*rey 48 python

我测试sys.getsize('')sys.getsize(' ')在三种环境中,并在其中的两个sys.getsize('')给我51个字节(比第二个字节以上),而不是49个字节:

截图:

Win8 + Spyder + CPython 3.6:

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

Win8 + Spyder + IPython 3.6:

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

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

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

首先编辑

我在Python.exe中进行了第二次测试而不是Spyder和PyCharm(这两个仍然显示51),一切似乎都很好.显然我没有专业知识来解决这个问题所以我会留给你们:)

Win10 + Python 3.7控制台与PyCharm使用相同的解释器:

在此输入图像描述

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

在此输入图像描述

use*_*ica 30

这听起来像是检索字符串对象的wchar表示.从CPython 3.7开始,CPython Unicode表示的工作方式,空字符串通常以"紧凑的ASCII"表示形式存储,64位构建的紧凑ASCII字符串的基本数据和填充可达48字节,加上一个字节的字符串数据(只是空终止符).您可以在此处查看相关的头文件.

就目前而言(这计划在4.0中删除),还有一个选项来检索字符串的wchar_t表示.在具有2字节wchar_t的平台上,空字符串的wchar表示是2个字节(再次只是空终止符).wchar表示在第一次访问时缓存在字符串上,并str.__sizeof__在存在时考虑这些额外数据,从而产生总共51个字节.

  • 这在很大程度上与这个问题无关,但是看到对"[Python] 4.0"的引用让我感到焦虑...... (9认同)
  • getsizeof()确实在内部引用`__sizeof__`.这是正确的答案 (2认同)
  • @NicholasHumphrey:有些东西正在检索IPython测试中的wchar表示.(另外,你的IPython测试也使用CPython; CPython是IPython运行的解释器实现.) (2认同)

Abh*_*ari 5

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

sys是特定于系统的,因此很容易区别.每个人都经常忽视这一点.python中所有特定于系统的东西都已经被sys包装在包中多年了.例如,sys.getwindowsversion()根据定义,它不是便携式的,但它就在那里.它就像在完美的跨平台编码世界中无底洞的拒绝.你看到的是Python的一个有趣的小块.

来自getsizeofdocs:

仅考虑直接归因于对象的内存消耗,而不考虑它所引用的对象的内存消耗. 如果对象由垃圾收集器管理,则getsizeof()调用该对象的__sizeof__方法并添加额外的垃圾收集器开销.

当使用垃圾收集时,操作系统将添加这些额外的位.如果您阅读Python和GC Q&A 何时在python中收集垃圾?人们已经进入了令人难以忍受的细节阐述GC以及它将如何影响内存/引用计数和比特等等.

我希望这可以解释这来自哪里.如果您不使用system级别属性但使用更多pythonic属性,那么您将获得一致的大小.

  • 这不是GC数据.GC从不跟踪字符串对象; 他们没有这些数据.此外,相同的对象将在提问者测试的所有配置上具有GC数据. (3认同)