Python中的子串.内存中的副本?

假设我在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中的子串.内存中的副本? - 代码日志