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
,它不会复制.