>>> import sys
>>> sys.getsizeof("")
40
为什么空字符串使用这么多字节?有人知道这 40 个字节中存储了什么吗?
>>> import sys
>>> sys.getsizeof("")
40
为什么空字符串使用这么多字节?有人知道这 40 个字节中存储了什么吗?
在 Python 中,字符串是对象,所以值就是对象本身的大小。所以这个大小总是大于字符串大小本身。
来自stringobject.h
:
typedef struct {
PyObject_VAR_HEAD
long ob_shash;
int ob_sstate;
char ob_sval[1];
/* Invariants:
* ob_sval contains space for 'ob_size+1' elements.
* ob_sval[ob_size] == 0.
* ob_shash is the hash of the string or -1 if not computed yet.
* ob_sstate != 0 iff the string object is in stringobject.c's
* 'interned' dictionary; in this case the two references
* from 'interned' to this object are *not counted* in ob_refcnt.
*/
} PyStringObject;
从这里您可以获得有关如何使用这些字节的一些线索:
len(str)+1
存储字符串本身的字节;您可以在Laurent Luce的博客文章中找到有关 Python 字符串实现的一些信息。此外,您可以浏览源代码。
字符串对象的大小取决于操作系统和机器类型以及一些选择。在 64 位 FreeBSD 上,将 unicode 用于字符串文字 ( from __future__ import unicode_literals
):
In [1]: dir(str)
Out[1]: ['__add__', '__class__', '__contains__', '__delattr__', '__doc__',
'__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__',
'__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__le__',
'__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__',
'__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__',
'__sizeof__', '__str__', '__subclasshook__', '_formatter_field_name_split',
'_formatter_parser', 'capitalize', 'center', 'count', 'decode', 'encode',
'endswith', 'expandtabs', 'find', 'format', 'index', 'isalnum', 'isalpha',
'isdigit', 'islower', 'isspace', 'istitle', 'isupper', 'join', 'ljust',
'lower', 'lstrip', 'partition', 'replace', 'rfind', 'rindex', 'rjust',
'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip',
'swapcase', 'title', 'translate', 'upper', 'zfill']
In [2]: import sys
In [3]: sys.getsizeof("")
Out[3]: 52
In [4]: sys.getsizeof("test")
Out[4]: 68
In [7]: sys.getsizeof("t")
Out[7]: 56
In [8]: sys.getsizeof("te")
Out[8]: 60
In [9]: sys.getsizeof("tes")
Out[9]: 64
在这种情况下,每个字符额外使用 4 个字节。
它以空值给出 str 类的对象大小,在执行此类操作时,sys.getsizeof("")
它实际上创建了一个具有许多属性的字符串类对象,然后计算该对象的大小。它等于,
x = str()
sys.getsizeof(x) #in my environment it prints 37
然后对于每个 char 它需要 1 个字节
x = "r"
sys.getsizeof(x) #prints 38
x = "ros"
sys.getsizeof(x) #prints 40