假设我在 Python 中有一个字符串 my_string
并且我根据 some_pattern
对其进行标记:
match.re.search(some_pattern, my_string)
string_1 = match.group(1)
string_2 = match.group(2)
....
string_1
和 string_2
(“深”)是 my_string
中子字符串的副本还是对内存中相同位置的引用? string_1
和 string_2
是否为 my_string
中字符的完整副本分配内存?
请注意,我不是在询问字符串的不变性。如果 my_string
很长,我想知道通过标记化我的字符串在内存中的命中率是多少。
我不需要确切地知道有多少内存被重新使用,但知道字符串的标记化是否最终会导致内存重复肯定会很有用。
最佳答案
通过查看 Python 2.7.3 源代码,获取字符串的一部分可以复制字符数据:
Objects/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 - Python 中的子字符串。内存中的副本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13710329/