假设我在Python中有一个字符串my\_string,并根据some\_pattern对其进行标记:

match.re.search(some_pattern, my_string)
string_1 = match.group(1)
string_2 = match.group(2)
....

是my\_string中子串的string\_1和string\_2(“深”)副本还是对内存中相同位置的引用? string\_1和string\_2是否为my\_string中的字符的完整副本分配内存?

请注意,我不是在询问字符串的不变性.如果my\_string非常长,我想通过标记我的字符串来了解内存中的命中是什么.

我不需要确切知道重复使用了多少内存,但知道字符串的标记化是否最终会重复内存肯定会有用.


解决方法:

从查看Python 2.7.3源代码,获取字符串切片会生成字符数据的副本:

对象/ stringobject.c:

string\_slice()调用以下函数PyString\_FromStringAndSize():

/* Inline PyObject_NewVar */
op = (PyStringObject *)PyObject_MALLOC(PyStringObject_SIZE + size);
if (op == NULL)
    return PyErr_NoMemory();
PyObject_INIT_VAR(op, &PyString_Type, size);
op->ob_shash = -1;
op->ob_sstate = SSTATE_NOT_INTERNED;
if (str != NULL)
    Py_MEMCPY(op->ob_sval, str, size);
op->ob_sval[size] = '\0';

这里,str是指向字符数据的指针,size是长度.注意malloc和memcpy.

不同的Python实现(实际上不同版本的CPython)可能表现不同.例如,Jython可能使用java.lang.String,它不会复制.

标签: python, string, regex, immutability

相关文章推荐

添加新评论,含*的栏目为必填