Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python字符串内部和子字符串_Python - Fatal编程技术网

Python字符串内部和子字符串

Python字符串内部和子字符串,python,Python,当您执行如下子字符串操作时,python是否会创建一个全新的字符串(复制内容): new_string = my_old_string[foo:bar] 还是使用interning来指向旧数据 作为澄清,我很好奇底层字符缓冲区是否像Java中那样共享。我意识到字符串是不可变的,并且总是看起来是一个全新的字符串,它必须是一个全新的字符串对象。在Python中,字符串是不可变的。这意味着您将始终在任何切片、连接或其他操作上获得副本 这是一个很好的解释,解释了不可变字符串背后的一些原因。这是一个全新

当您执行如下子字符串操作时,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切片
。非常正确。。。我只是花了一个小时试图弄明白为什么测试并没有运行这个代码。