Выполняет ли Python срез по ссылке для строк?

#python #string

#python #строка

Вопрос:

Я хочу знать, если, когда я делаю что-то вроде

 a = "This could be a very large string..."
b = a[:10]
  

создается новая строка или возвращается представление / итератор

Комментарии:

1. Обратите внимание, что вы можете использовать itertools.islice для последнего.

2. Что вы узнали, когда вы запустили его и использовали id() для проверки подлинности объекта?

3. @S.Лотт: Представление будет отличаться id() от объекта, для которого оно было представлением. Так что на самом деле это вас ничему не научит. Выполнение type() более полезно.

Ответ №1:

Python выполняет срез по копированию, то есть каждый раз, когда вы выполняете срез (за исключением очень тривиальных срезов, таких a[:] как), он копирует все данные в новый объект string.

По словам одного из разработчиков, этот выбор был сделан потому, что

Подход [срез по ссылке] более сложный, его сложнее реализовать и он может привести к неожиданному поведению.

Например:

a = "длинная строка с 500 000 символов ..."
b = a[0]
del a

С дизайном «срез как копия» строка a немедленно освобождается. Дизайн среза как ссылки сохранит строку размером 500 КБ в памяти, хотя вас интересует только первый символ.

По-видимому, если вам абсолютно нужно представление строки, вы можете использовать memoryview объект.

Комментарии:

1. @BlueRaja-Danny-Pflughoeft Каковы другие возможные виды тривиальных срезов?

2. @sandeeps однобайтовые фрагменты, пустой фрагмент

3. Если я это сделаю word='python' word[2:3] == word[2:-3] , я получу true . И если я сравниваю id(word[2:3]) и id(word[2:-3]) , они одинаковы. Означает ли это, что при срезе python выполняет некоторую интернирующую работу для идентичных строк?

4. memoryview на самом деле не помогает для строк, потому что он работает только с объектами, которые поддерживают протокол buffer, такими как bytes и bytearray

Ответ №2:

Когда вы срезаете строки, они возвращают новый экземпляр String. Строки являются неизменяемыми объектами.

Комментарии:

1. Хотя это и верно, это не отвечает на вопрос: он спрашивает, копируются ли данные или нет.

2. Это причина, по которой вы ожидаете, что представления среза не будут копировать. Одно из распространенных применений неизменяемых данных заключается в том, что вместо них легко передавать ссылки. Итак, мне любопытно, почему в Python он выполняет копирование.