Python字符串内部和子字符串
当您执行如下子字符串操作时,python是否会创建一个全新的字符串(复制内容):Python字符串内部和子字符串,python,Python,当您执行如下子字符串操作时,python是否会创建一个全新的字符串(复制内容): new_string = my_old_string[foo:bar] 还是使用interning来指向旧数据 作为澄清,我很好奇底层字符缓冲区是否像Java中那样共享。我意识到字符串是不可变的,并且总是看起来是一个全新的字符串,它必须是一个全新的字符串对象。在Python中,字符串是不可变的。这意味着您将始终在任何切片、连接或其他操作上获得副本 这是一个很好的解释,解释了不可变字符串背后的一些原因。这是一个全新
new_string = my_old_string[foo:bar]
还是使用interning来指向旧数据
作为澄清,我很好奇底层字符缓冲区是否像Java中那样共享。我意识到字符串是不可变的,并且总是看起来是一个全新的字符串,它必须是一个全新的字符串对象。在Python中,字符串是不可变的。这意味着您将始终在任何切片、连接或其他操作上获得副本
这是一个很好的解释,解释了不可变字符串背后的一些原因。这是一个全新的字符串(因此,在可行的情况下,可以放弃旧的较大字符串,而不是仅仅因为某个小字符串被从中切掉并保留下来而活下来)
实习生
是另一回事。看起来我可以回答我自己的问题,打开来源,猜测我发现了什么:
static PyObject *
string_slice(register PyStringObject *a, register Py_ssize_t i,
register Py_ssize_t j)
... snip ...
return PyString_FromStringAndSize(a->ob_sval + i, j-i);
..没有提到实习。FromStringAndSize()仅显式地在大小为1和0的字符串上实习
所以很明显,你总是会得到一个全新的对象,它们不会共享任何缓冲区 检查显示:
当切片索引与原始字符串的开始和结束匹配时,将返回原始字符串
否则,您将从StringAndSize获得函数
PyString\u的结果,该函数接受现有的string对象。对于0或1个字符宽的字符串,此函数返回一个插入字符串;否则,它会将子字符串复制到一个新的字符串对象中。您可能还对islice感兴趣,它提供了原始字符串的视图
>>> from sys import getrefcount
>>> from itertools import islice
>>> h="foobarbaz"
>>> getrefcount(h)
2
>>> g=islice(h,3,6)
>>> getrefcount(h)
3
>>> "".join(g)
'bar'
>>>
在Java中,字符串是不可变的,但是substring方法返回对同一字符缓冲区的引用;您需要字符串\u切片
。非常正确。。。我只是花了一个小时试图弄明白为什么测试并没有运行这个代码。