python - Python 中的子字符串。内存中的副本?

标签 python regex string immutability

假设我在 Python 中有一个字符串 my_string 并且我根据 some_pattern 对其进行标记:

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

string_1string_2(“深”)是 my_string 中子字符串的副本还是对内存中相同位置的引用? string_1string_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/

相关文章:

python - "if x in self:"是什么意思?

python - float 子类以改变摄入量和 __str__ 行为

python - 如何让 Python 脚本全天候运行 24/7

javascript - 如何选择最少出现的字符?

C:正则表达式与浮点文字不匹配

c# - 从字符串中删除下划线,除了字符串中的链接

python - Pandas - 确定 Churn 是否发生缺失年份

c - 当我们可以或不能修改字符串文字时

c++在类似结构的数组中仅给出字符串的一部分时查找字符串

jquery - 拆分字符串并在单词之间添加连字符