我测试过sys.getsize('')
and sys.getsize(' ')
在三种环境中,在其中两种环境中sys.getsize('')
给我 51 个字节(比第二个字节多一个字节)而不是 49 个字节:
截图:
Win8 + Spyder + Python 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 使用相同的解释器:
这听起来像是有东西正在访问已弃用的 Py_UNICODE API。
从 CPython 3.7 开始,CPython Unicode 表示的工作方式是,空字符串通常以“紧凑 ASCII”表示形式存储,并且 64 位构建上紧凑 ASCII 字符串的基本数据和填充计算为 48 个字节,加上一个字节的字符串数据(只是空终止符)。可以看到相关的头文件here https://github.com/python/cpython/blob/v3.7.0/Include/unicodeobject.h#L198.
现在(这是计划拆除 https://docs.python.org/3/c-api/unicode.html#deprecated-py-unicode-apis在 3.12 中),还有一个已弃用的 Py_UNICODE API,它存储字符串的辅助 wchar_t 表示形式。在具有 2 字节 wchar_t 的平台上,空字符串的 wchar_t 表示形式为 2 字节(又是空终止符)。 Py_UNICODE API 在第一次访问时将此表示形式缓存在字符串对象上,并且str.__sizeof__
当存在这些额外数据时,将其计入其中,总计 51 字节。
(如果您需要字符串的 wchar_t 表示形式,则获取该字符串的非弃用方法是使用PyUnicode_AsWideChar https://docs.python.org/3.11/c-api/unicode.html#c.PyUnicode_AsWideChar or PyUnicode_AsWideCharString https://docs.python.org/3.11/c-api/unicode.html#c.PyUnicode_AsWideCharString。这些函数不会计划删除,并且不会将任何数据附加到字符串对象。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)