我测试sys.getsize('')和sys.getsize(' ')在三种环境中,并在其中的两个sys.getsize('')给我51个字节(比第二个字节以上),而不是49个字节:
截图:
Win8 + Spyder + CPython 3.6:
Win8 + Spyder + IPython 3.6:
Win10(VPN远程)+ PyCharm + CPython 3.7:
首先编辑
我在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个字节.
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属性,那么您将获得一致的大小.