代码之家  ›  专栏  ›  技术社区  ›  rhettg

Python字符串内部和子字符串

  •  4
  • rhettg  · 技术社区  · 16 年前

    当您执行如下子字符串操作时,python是否会创建一个全新的字符串(复制内容):

    new_string = my_old_string[foo:bar]
    

    还是使用interning来指向旧数据?

    5 回复  |  直到 16 年前
        1
  •  8
  •   Jonathan Feinberg    16 年前

    the source 揭示:

    否则,您将得到函数的结果 PyString_FromStringAndSize ,它接受现有的字符串对象。对于0或1个字符宽的字符串,此函数返回一个插入字符串;否则,它会将子字符串复制到新的字符串对象中。

        2
  •  8
  •   John La Rooy    16 年前

    您可能还对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'
    >>> 
    
        3
  •  2
  •   Alex Martelli    16 年前

    intern 但这是另一回事。

        4
  •  0
  •   Dmitry Mukhin    16 年前

    看来我可以回答我自己的问题,打开来源,猜猜我发现了什么:

        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的字符串上实习 所以很明显,你总是会得到一个全新的对象,它们不会共享任何缓冲区。

        5
  •  -2
  •   gahooa    16 年前

    在Python中,字符串是不可变的。这意味着您将始终在任何切片、连接或其他操作上获得副本。

    http://effbot.org/pyfaq/why-are-python-strings-immutable.htm 对于不可变字符串背后的一些原因,这是一个很好的解释。